FFmepg解碼

FFmepg是音視頻開發最常用的編解碼庫,功能很強大,是所有音視頻開發人員必須要啃下去的硬骨頭,對于沒有底層開發基礎的,學習他并不是很容易,這里著重介紹下FFmepg解碼功能。參考代碼:https://github.com/ShirleyiOS/iOSH264PlayDemo

注冊FFmepg所有庫,這是使用FFmepg的入口

av_register_all();

因為這里使用的是FFmepg解碼功能,還要同時注冊下其編解碼庫

avcodec_register_all();

查找解碼器,因為這里是解碼h264的數據,所以參數選擇CODEC_ID_H264

m_pcodec = avcodec_find_decoder(CODEC_ID_H264);

初始化AVPacket,在h264中,一個packet對應一個nal單元

m_packet = new AVPacket;
av_init_packet(m_packet);

給編解碼器分配內存

m_context = avcodec_alloc_context3(m_pcodec);

初始化編解碼器的AVCodecContext

avcodec_open2(m_context, m_pcodec, NULL)

給視頻幀分配內存

m_picture = av_frame_alloc();

以上都是解碼的準備工作,下面介紹拿到h264的視頻數據時,怎樣將其解碼成yuv數據

填充AVPacket結構體,data是h264數據,length是數據長度

m_packet->data = (unsigned char*)data;
m_packet->size = length;

下面是真正的解碼函數

int nBytesConsumed = avcodec_decode_video2(m_context, m_picture, &nGotPicture, (const AVPacket*)m_packet);

得到的m_picture就是我們需要的數據,m_picture->data[0]存y,m_picture->data[1]存u, m_picture->data[2]存V,把這些數據處理成我們想要的就行。

最后別忘了釋放相應的數據,這里不在貼相關代碼,具體請參考文章一開始的demo程序。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容