2013-12-12 206 views
0

我想使用MediaCodec API解碼視頻樣本。我正在使用surfaceView來顯示渲染的樣本。如果我按主頁按鈕,應用程序進入暫停狀態和表面被破壞。當我回來恢復狀態時,新的surfaceView參考正在創建,但解碼器無法在surfaceView上抽取樣本。所以屏幕顯示爲黑色。 視頻配置: videoDecoder.configure(format,surface,null,0); 那麼我怎麼能重新配置videoDecoder在上面的聲明。它類似於以下問題 How to keep decoding alive during screen orientation?視頻解碼器使用MediaCodec配置

回答

1

MediaCodec API目前不提供替代輸出Surface的方法(API 19)。

正如在你提到的另一個問題中,我認爲解決這個問題的方法是解碼爲與視圖層次無關的Surface(因此,當Activity被摧毀)。

如果您將MediaCodec的輸出指向SurfaceTexture,則可以將該紋理渲染到SurfaceView上。這將需要一些GLES代碼。你可以在Grafika sources找到必要的片段,但目前還沒有完全實現你想要的東西(例如PlayMovieActivity將視頻解碼爲SurfaceTexture,但該ST是TextureView的一部分,將被拆除)。

額外的渲染步驟將增加GPU負載,並且不適用於受DRM保護的視頻。對於大多數設備和應用程序,這並不重要。請參閱bigflake examples

更新:我已將此添加到Grafika,有一個轉折。請參閱「雙重解碼」示例。輸出轉到與TextureView關聯的SurfaceTexture。如果屏幕旋轉(或當前通過按下電源按鈕消隱),解碼將繼續。如果您使用「後退」或「主頁」按鈕離開活動,解碼將停止。它的工作原理是保留SurfaceTexture,將其附加到新的TextureView

+0

嗨fadden謝謝你的迴應。你可以給一些示例代碼。 – saa

+0

我不會在接下來的幾周更新bigflake/grafika。順便說一句,如果您使用MediaExtractor(而不是流式傳輸H.264)從文件中提取視頻,那麼您應該能夠在重新啓動活動後重新創建提取器/解碼器,並且只需要找到停止的位置即可。時間偏移可以從演示時間戳中確定。 – fadden

+0

謝謝fadden。我會根據你的建議更改我的代碼。 – saa

相關問題