2014-11-04 101 views
4

在TextureView中使用MediaPlayer播放視頻時,它可以工作。在Android的TextureView中的視頻播放視頻時出現問題

當視頻結束並且應該播放另一個視頻時,我調整TextureView的大小以適應即將到來的視頻的縱橫比(例如 - 從3:4到9:16等等)。

的問題,第一視頻結束後,它的最後一幀保持所示, 比起TextureView被調整大小,第一視頻的最後一幀保留的一瞬間,但現在用壞縱橫比,所述第二部影片播放得很好。

IMAGE1: 視頻1,(3:4):

enter image description here

圖像2:

的視頻顯示(尺寸X大小)的矩形圖像 視頻1,我們在這裏在兩個視頻之間,視頻1的最後一幀,現在在(9:16)調整大小後,但矩形看起來很糟糕。下面的圖片示出了用於一秒鐘:

enter image description here

的Image3: 視頻2,(9:16),以及播放但示出一秒鐘後圖像2:

enter image description here

代碼沒有什麼特別之處,下面是它的一些部分:

// To init the TextureView and MediaPlayer: 

public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { 
    m_MediaPlayer = new MediaPlayer(); 
    m_Surface = new Surface(surfaceTexture); 
    m_MediaPlayer.setSurface(m_Surface); 
} 

m_TextureView.setSurfaceTextureListener(this); 

// To Resize: 
LayoutParams layoutParams = new FrameLayout.LayoutParams(newTVWidth, newTVHeight); 
layoutParams.gravity = Gravity.CENTER; 
m_TextureView.setLayoutParams(layoutParams); 

// To play: 
m_MediaPlayer.reset(); 
m_MediaPlayer.setDataSource(videoFilePath); 
m_MediaPlayer.prepare(); 
// <--- Here comes a call to "To Resize" which is shown right above this code 
m_MediaPlayer.start(); 
+0

嗨Miko Diko,你找到了上述問題的解決方案。我嘗試了一切,但沒有成功。 – user1154390 2015-03-04 12:36:36

+0

將您的紋理視圖放在相同的包裝佈局的寬度和高度,然後在setLayoutParams()中。它有訣竅。我用這種方法解決了同樣的問題。我不知道它是如何工作的,但經過大量研究後,它對我很有用。如果需要更多信息,請告訴我。 – user1154390 2015-03-04 16:12:13

+0

嘿,我不明白你的意思,你介意發佈代碼顯示如何? – 2015-04-03 22:44:19

回答

2

你可能有幾個選擇。

理論上,您可以通過斷開媒體播放器,使用GLES清除表面,然後再次連接媒體播放器來清除表面。參見Grafika的PlayMovieSurfaceActivity中的clickPlayStop()clearSurface()。這使用MediaCodec,而不是MediaPlayer,所以我不確定它會如何翻譯。

另一種選擇是使用TextureView變換而不是自定義框架佈局來設置縱橫比。由於您的佈局不會更改,因此不會出現扭曲幀的閃光。以PlayMovieActivity爲例,參見adjustAspectRatio()