2016-12-30 66 views
0

我找不到任何關於此主題的信息。也許你的某個人可能會幫忙。 我正在使用Android MediaCodec來解碼H264幀。 MediaCodec用於同步模式。我想測量從排隊一個單幀到解碼器到它在屏幕上實際可見的點的時間。Android媒體編解碼器:解碼和顯示一個視頻幀需要多長時間

所以,在我的代碼某些時候,我打電話

codec.getInputBuffer(inIndex); 

而且算賬:

int outIndex = codec.dequeueOutputBuffer(bufferInfo, BUFFER_TIMEOUT); 

if(outIndex >= 0) 
    codec.releaseOutputBuffer(outIndex, true); 
    if(PMVR.calculateLatency && validIteration) { 
     PMVR.calculateLatency = false; 
     PMVR.pingEnded = System.nanoTime(); 
} 

所以問題一:我可以假設先前排隊到輸入緩衝器的幀是在撥打dequeuOutputBuffers()(注意:同步模式)時,我會解碼一個?我找不到實際設置圖片ID的選項...

問題二:我打電話releaseOutputBuffer()render=true。實際顯示解碼幀需要多長時間?

感謝您的幫助,

克里斯托夫

回答

0

首先,記住,解碼器以異步方式工作。無論您是以同步還是異步模式使用MediaCodec API,都不會改變這一點;這隻會改變你是否需要輪詢解碼器的輸入/輸出,或者你是否通過回調來獲取它們。

一般情況下,你不會得到接近解碼器的全部性能,如果你只是傳遞了一個解碼包,你繼續下一個之前等待解碼的幀。在很多情況下,如果你這樣做,你甚至無法實時解碼視頻。一些解碼器甚至在您輸入了幾個數據包(或信號流尾)之前甚至不會返回單個幀輸出。

你不能可靠地假設幀你出去是對應於你傳遞的解碼包中的一個。如果數據流使用幀重新排序(就像H264中的B幀一樣),輸出幀將不會與輸入幀的順序相同。如果數據包被損壞,解碼器可能會跳過返回一些幀。

要通過解碼器識別各個幀,可以使用參數的presentationTimeUs參數,該參數被傳遞到MediaCodec.BufferInfo中的相同字段。只要此值在所有輸入數據包中都是唯一的,您應該可以使用它將輸入數據包追蹤到輸出幀中。

當您撥打releaseOutputBufferrender=true,框架將盡快顯示;我不認爲它的確切定義是在多長時間內完成,但在一兩次屏幕刷新中,可能是您可以假設的。由於API級別21,您可以傳遞一個參數long renderTimestampNs,允許您更確切地指定應該顯示的時間。