ffmpeg為AVPacket添加解碼頭信息

FFmpeg解碼獲得的AVPacket只包含視頻壓縮數據,并沒有包含相關的解碼信息
(比如:h264的sps pps頭信息,AAC的adts頭信息),沒有這些編碼頭信息解
碼器(MediaCodec)是識別不到不能解碼的。在FFmpeg中,這些頭信息是保存
在解碼器上下文(AVCodecContext)的extradata中的,所以我們需要為每一種
格式的視頻添加相應的解碼頭信息,這樣解碼器(MediaCodec)才能正確解析
每一個AVPacket里的視頻數據。

主要使用的類AVBitStreamFilter

添加過程:


const AVBitStreamFilter *absFilter = NULL;
AVBSFContext *absCtx = NULL;
AVCodecParameters *codecpar = NULL;

//1. 找到相應解碼器的過濾器
if(strcasecmp(codecName, "h264") == 0){
    absFilter = av_bsf_get_by_name("h264_mp4toannexb");
}else if(strcasecmp(codecName, "h265") == 0){
    absFilter = av_bsf_get_by_name("hevc_mp4toannexb");
}

//2.過濾器分配內存
av_bsf_alloc(absFilter,absCtx)

//3. 添加解碼器屬性
if(pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
    codecpar = pFormatCtx->streams[i]->codecpar;
}
avcodec_parameters_copy(absCtx->par_in, codecpar);

//4. 初始化過濾器上下文
av_bsf_init(absCtx);

//5. AVPacket處理
if(av_bsf_send_packet(absCtx, avPacket) != 0){
    av_packet_free(&avPacket);
    av_free(avPacket);
    avPacket = NULL;
    continue;
}
while(av_bsf_receive_packet(absCtx, avPacket) == 0){
    LOGE("開始解碼");
    av_packet_free(&avPacket);
    av_free(avPacket);
    continue;
}
avPacket = NULL;

//6. 釋放資源
av_bsf_free(&absCtx);
absCtx = NULL;


ffmpeg流過濾器列表
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • FFmpeg 介紹 FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。采用LG...
    Y了個J閱讀 11,578評論 0 28
  • ### YUV顏色空間 視頻是由一幀一幀的數據連接而成,而一幀視頻數據其實就是一張圖片。 yuv是一種圖片儲存格式...
    天使君閱讀 3,658評論 0 4
  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,987評論 0 3
  • 一. 概述 蘋果從iOS 8開始,開放了硬編碼和硬解碼的api,所以,從iOS 8開始,需要解碼H.264視頻時,...
    金山視頻云閱讀 10,507評論 1 25
  • 蝶戀花 磁鐵般的芬芳 魚游向大海 追逐夢的企及 風撩一個弧度 你為三十九度瘋狂 落花飄在水里 留戀著賞花的人 路吸...
    云中飄舞閱讀 320評論 40 54

友情鏈接更多精彩內容