2013-10-09 75 views
3

在我的Android應用程序中,我使用MediaCodec對webm(vp8)格式的某些媒體進行了編碼。編碼按預期工作。不過,我需要確保我偶爾創建一個同步幀。這是我做的:MediaCodec編碼忽略我的BUFFER_FLAG_SYNC_FRAME標誌

encoder.queueInputBuffer(..., MediaCodec.BUFFER_FLAG_SYNC_FRAME); 

稍後在代碼中,我檢查同步幀:

encoder.dequeueOutputBuffer(bufferInfo, 0); 
boolean isSyncFrame = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME); 

的問題是,isSyncFrame永遠不會獲得真正的價值。

我想知道如果我在編碼配置中犯了一個錯誤。可能有更好的方法來告訴編碼器偶爾創建一個同步幀。

我希望它不是MediaCodec中的錯誤。預先感謝您的幫助。

回答

3

沒有(當前爲Android 4.3)方式使用MediaCodec編碼器請求按需同步幀。這部分歸因於OMX,Android的基礎編解碼器實現,它沒有提供指定哪個輸入幀應該被編碼爲同步幀的方式;儘管它有辦法在不久的將來「觸發同步幀」。

feisal的答案是目前唯一支持控制同步幀的方式,但您必須在配置時執行此操作。

==編輯回覆:傑斯

可以使用MediaCodec.setParameter觸發在不久的將來同步幀:

Bundle params = new Bundle(); 
params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); 

mCodec.setParameters(syncFrame); 

不幸的是,沒有(可靠)的方式,如果告訴在MediaCodec一個編碼的緩衝區是一個同步幀,而不是通過檢查字節碼來完成。

+0

謝謝你的幫助。問候。 – Peter

+1

「OMX []沒有提供一種方法來指定哪個輸入幀應該被編碼爲同步幀」 - 這是瘋狂的....所以如何生成iframe /關鍵幀來響應RTCP PLI(丟包)? – jesup

+0

@LajosMolnar請幫忙回答這個問題? http://stackoverflow.com/questions/31823231/how-to-update-mediacodec-encoding-bitrate-dynamically-while-streaming-in-android –

1

您可以通過setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,int secs_between_iframes)設置編碼器的MediaFormat對象中的I幀的速率;

+0

謝謝你的幫助。問候。 – Peter