2013-10-07 44 views
2

Folk,如何在屏幕方向保持解碼狀態?

我正在使用MediaCodec來解碼網絡流。 MediaCodec上的方法configure()將SurfaceView對象作爲參數,可以很容易地將輸出解碼到表面視圖中。

設備方向改變時出現問題。舊的表面被破壞並創建一個新的表面。 mediacodec仍然持有的表面變得無效。

我無法銷燬MediaCodec對象並重新創建一個新對象。這將導致等待幾秒鐘,直到新的關鍵視頻幀到達。看看MediaCodec上所有可用的方法,看起來改變表面的唯一方法是調用configure()。可以在MediaCodec對象上多次調用configure()嗎?

或者,也許有一種方法可以存儲MediaCodec對象的內部狀態並將其傳輸到新的MediaCodec對象。

如果你能指導我正確的方向,我將不勝感激。預先感謝您的幫助。

+0

'MediaCodec'對象上允許的操作集有點模糊。另一種方法是配置不與顯示器連接的「表面」,例如,一個'SurfaceTexture',然後用OpenGL ES渲染成'GLSurfaceView'。 – fadden

+0

謝謝你的幫助。我會嘗試SurfaceTexture。 – Peter

+0

您可以嘗試TextureView,「與SurfaceView不同,TextureView不會創建一個單獨的窗口,而是表現爲一個普通的View。這個關鍵區別允許TextureView被移動,轉換,動畫等。例如,您可以製作一個TextureView semi-通過調用myView.setAlpha(0.5f)來顯示半透明。「我的問題是我無法通過使用Mediacodec成功解碼h264幀,也許你可以給我一些幫助,我的電子郵件是[email protected],謝謝! –

回答

2

現在有這樣的Grafika一個例子。請參閱「雙重解碼」活動。

它的工作方式是將視頻解碼器的輸出指向SurfaceTexture,而不是直接指向視圖。 SurfaceTexture附加到TextureView。當視圖因設備旋轉而改變時,會創建一個新的TextureView,然後我們使用setSurfaceTexture()方法刪除舊的SurfaceTexture

如果您將活動留在「後退」或「回家」,解碼器將關閉。這對於切換到其他應用時避免捆綁硬件編解碼器資源非常有用。

如果您使用電源鍵關閉屏幕,可能會或可能不需要,它目前不會關閉解碼器。

爲了讓生活更有趣,它並行解碼兩條流。

+0

非常感謝!我已經使用你的想法解決了設置界面和'IllegalStateException'方向問題。感謝偉大的** Grafika ** –

相關問題