我正在製作一個視頻編碼應用程序,當主持人活動進入後臺或屏幕循環關閉/打開時,我想阻止該應用程序停止。具有表面輸入的MediaCodec:在後臺錄製
我的編碼器的體系結構來源於優秀的CameraToMpegTest示例,並在GLSurfaceView中添加了相機框架(請參閱下面的Github鏈接)。我目前執行的背景與雙態溶液記錄:
當託管活動是在前臺,在每個呼叫中的一個視頻幀進行編碼的
GLSurfaceView.Renderer
的。這允許我以突發方式訪問GLSurfaceView的EGL狀態,以免阻塞其他排隊到渲染器線程的事件。當主機活動進入後臺時,停止編碼並在循環內的另一後臺線程上對幀進行編碼。該模式與CameraToMpegTest示例相同。
然而如果屏幕斷電的GLSurfaceView的EGLContext丟失和onSurfaceCreated
新呼叫發生。在這種情況下,我們必須重新創建連接到MediaCodec輸入曲面的EGL窗口表面。不幸的是,以eglCreateWindowSurface
這第二個呼叫生產:
E/libEGL(18839): EGLNativeWindowType 0x7a931098 already connected to another API
之前要調用,我release all EGL resources connected to the Android Surface。
有沒有辦法交換連接到MediaCodec輸入表面的EGLSurface?
我的測試應用程序的完整源代碼是Github。 Main Activity。
更新我將這裏學到的經驗應用於基於MediaCodec & MediaMuxer類的video sdk for Android。希望能幫助到你!
'MediaCodec'不應該受背景影響(甚至不知道)。見例如在Android 4.4中添加了'screenrecord'命令,該命令在後臺快樂地運行。事實上,它的編碼*任何*意味着它仍然接收輸入數據,somy猜測會有什麼影響'相機'。我不明白爲什麼當預覽'byte []'有實際的數據時,預覽'Surface'是空白的。 – fadden
更新了我的問題。我現在可以轉換到後臺錄製(沒有GLSurfaceView顯示),然後前景錄製(GLSurfaceView顯示)**除了**當屏幕關閉/開啓事件發生在臨時... – dbro
你錯過了一個'glSurfaceView .onPause()'在你的主要活動onPause()中。不知道這是否會影響。我明天可以玩一下,看看我能否複製這種行爲。 – fadden