想利用cocoa自帶的硬解VDT框架,去解碼h24視頻召娜,省去ffmpeg軟件帶來的發(fā)熱耗電問題运褪。
調(diào)研中遇到的坑
- 尋找圖像參數(shù)集pps及序列參數(shù)集sps,用于解碼玖瘸。
ffmpeg中上述信息保存在AVcodecContext的extradata中秸讹,要從上述字段中自己找出相應(yīng)的pps sps得以保存。uint8_t *extraData = pCodecCtx->extradata; int extraSize = pCodecCtx->extradata_size; for(unsigned int i = 0; i < extraSize; ++i) { if ((i > 0) && extraData[i] == 0x67) { int lengthPos = i -1; _spsSize = extraData[lengthPos]; _sps = malloc(_spsSize); memcpy(_sps, extraData + i, _spsSize); } if (extraData[i] == 0x68) { int lengthPos = i -1; _ppsSize = extraData[lengthPos]; _pps = malloc(_ppsSize); memcpy(_pps, extraData + i, _ppsSize); } }
如果是標(biāo)準(zhǔn)的264流雅倒,在讀取每個(gè)naul根據(jù)頭信息判斷是否為sps pps
* 解碼后B,P幀重排問題
VDT解碼是按照dts的順序解的璃诀,在有B幀的情況下,解出來的數(shù)據(jù)的pts是亂序的蔑匣,如果即可交給渲染器渲染劣欢,會出現(xiàn)常見的抖動現(xiàn)象。ffmpeg中Avpacket中保留有pts和dts信息殖演,利用pts對解碼之后的數(shù)據(jù)進(jìn)行重排序之后進(jìn)行渲染氧秘,可以消除抖動問題
* 音畫同步問題
視頻流根據(jù)pts和時(shí)基算出時(shí)間年鸳,和全局時(shí)鐘對比保證音畫同步趴久。
* demo地址 :https://github.com/duoluo/WFHardDecodeDemo
* demo中包含的問題:沒有添加opengl相應(yīng)的渲染代碼,只是利用NSImageView渲染了每一幀搔确。