[英]To use HW decoder in android through libstagefright, what to set for kKeyAVCC in meta data for frame base decoding instead of MP4 playback?
我一直在嘗試使用libstagefright來解碼h264壓縮幀。 我沒有MP4文件,而是想逐幀解碼。 我一直在從鏈接中探索樣本。 此示例使用ffmpeg來解析mp4文件。 並使用ffmpeg的avcodeccontext設置並查找所需的元數據。 現在我想設置kKeyAVCC,kKeyWidth,kKeyHeight,kKeyIsSyncFrame和kKeyTime。 我不清楚這些參數中的每一個。 所以,我想知道的是,是否需要設置所有這些參數? 這些參數的目的是什么,以及為逐幀解碼的元數據設置什么。 當我沒有設置kKeyTime時,omxcodec在讀取mediabuffer時崩潰。 如果我在讀取操作上取得成功,我沒有得到我在MediaBuffer的派生讀取方法中設置的元數據值。 我得到了幀的視頻尺寸和錯誤代碼INFO_FORMAT_CHANGED。
創建新的編解碼器時,元數據作為OMXCodec::Create
方法的一部分從解析器傳遞到解碼器。 我假設在你的實現中你會注意按照普通的vanilla android
實現中的指定傳遞MetaData
格式的元MetaData
。
例如,請參考AwesomePlayer::initVideoDecoder
,其中調用mVideoTrack->getFormat()
來獲取視頻軌道的元數據。 請注意,這不是MediaBuffer
一部分,而是作為單獨的對象傳遞。
創建解碼器后, configureCodec
調用configureCodec
。 在此方法中, OMXCodec
讀取不同的配置參數以初始化解碼器。
kKeyAVCC
對應於Codec Specific Data
或csd
,其基本上是底層H.264
流的SPS
和PPS
。
kKeyWidth
和kKeyHeight
對應於視頻幀的width
和height
。 要初始化解碼器,您可以設置更多其他參數。 例如,如果要為解碼器的輸出設置特定的colorFormat
,則可以通過kKeyColorFormat
設置相同的kKeyColorFormat
。
創建解碼器后,您必須通過標准的openmax
接口傳遞各個幀。 通過調用OMXCodec::read
方法啟動解碼器,該方法將填充輸入和輸出緩沖區。
輸入緩沖區通過OMXCodec::drainInputBuffer
方法填充,該方法從解析器模塊(在您的情況下是您的特定模塊)中讀取MediaBuffer
。 MediaBuffer
的內容被復制到填充在OMX
組件input port
上的緩沖區中。 除此數據外,還傳遞了此緩沖區的timestamp
。 時間戳信息通過kKeyTime
參數讀取,該參數與MediaBuffer
一起傳遞。
因此,對於在MediaBuffer
傳遞的每個幀,您需要確保有效timestamp
也傳遞給底層解碼器,該解碼器將反映在解碼器的輸出端口上。
在您的問題中,您已查詢過kKeyIsSyncFrame
。 該標志由Encoder
設置為FillBufferDone
回調的一部分,即當編碼器對IDR frame
類的關鍵幀進行編碼時,它通過該特定標志傳送該信息作為編碼器輸出端口上的回調的一部分。 對於解碼,這是不相關的 。
如果您可以在啟用OMXCodec
日志的情況下發布更多日志,則可能更容易提供更准確的答案。
PS在android框架中,有一個名為Stagefright
的命令行實用程序,它創建一個解析器和解碼器,並執行命令行解碼而不進行任何渲染。 這可能是您插入自己的解析器的一個很好的參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.