ffmpeg 解碼示例

相關(guān)

x264編碼
ffmpeg 編碼示例
碼流控制
h264編解碼末尾丟幀

示例

  1. 編碼前初始化,返回視頻寬高
    int* decode_init(char * in_filename)
    {
    avcodec_register_all();
    av_register_all();
    decode_frame = av_frame_alloc();
    AVPacket pkt;
    //獲取各種上下文
    if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
    retu = -1;
    goto end;
    }
    if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
    retu = -2;
    goto end;
    }
    //例遍流避归,找到流所對(duì)應(yīng)得下標(biāo)
    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
    / /Create output AVStream according to input AVStream
    AVFormatContext *ofmt_ctx;
    AVStream *in_stream = ifmt_ctx->streams[i];
    AVStream *out_stream = NULL;

             if (ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
                 videoindex = i;
    
             }
         }
         //open decoder
         video_dec_ctx = ifmt_ctx->streams[videoindex]->codec;
         video_dec = avcodec_find_decoder(video_dec_ctx->codec_id);
         if(avcodec_open2(video_dec_ctx,video_dec,NULL)<0)
         {
             retu = -3;
             goto end;
         }
         double g_height = ifmt_ctx->streams[videoindex]->codec->height;
         double g_width = ifmt_ctx->streams[videoindex]->codec->width;
    
         int* wh = malloc(sizeof(int)*2);
         wh[0] = g_width;
         wh[1] = g_height;
     end: 
         if(retu != 0)
             return NULL;
         else
             return wh;
     }   
    
  2. 解碼一幀
    AVFrame* decode_next()
    {
    if(decode_frame!=NULL)
    av_frame_unref(decode_frame);
    int ret = 0;
    int got_frame = 0;
    int error_time = 0;
    while(1)
    {
    //Get an AVPacket
    if (av_read_frame(ifmt_ctx, &pkt) < 0)
    {
    av_free_packet(&pkt);
    goto decode_free;
    }
    if (pkt.stream_index == videoindex)
    {
    ret = avcodec_decode_video2(video_dec_ctx,decode_frame, &got_frame, &pkt);
    if(got_frame)
    goto decode_success;
    else
    {
    if(failed_times ++<30)
    continue;
    else
    goto decode_free;
    }
    }
    av_free_packet(&pkt);
    }
    decode_free:
    av_free_packet(&pkt);
    return NULL;

     decode_success:
         return decode_frame;
     }
    

僅僅是在讀取packet之后就停止解碼會(huì)丟幀,參看
所以要在讀取packet失敗之后接著調(diào)用解碼桶雀,獲取剩余的幀。使用一個(gè)變量failed_times 記錄編碼器中存在的幀數(shù)疲憋。在讀取結(jié)束之后接著調(diào)用failed_times 次avcodec_decode_video2
int failed_times = 0龙巨;
int read_packet_failed = 0;
AVFrame* decode_next()
{
if(decode_frame!=NULL;
av_frame_unref(decode_frame);
int ret = 0;
int got_frame = 0;
int error_time = 0;
while(1)
{
if (av_read_frame(ifmt_ctx, &pkt) < 0)
{
read_packet_failed = 1;
av_free_packet(&pkt);
if(failed_times > 0)
{
failed_times--;
goto decode;
}
else
goto decode_free;
}
if (pkt.stream_index == videoindex)
{
decode:
ret = avcodec_decode_video2(video_dec_ctx,decode_frame, &got_frame, &pkt);
if(got_frame)
goto decode_success;
else
{
if(read_packet_failed)
goto decode_free;
else
{
failed_times ++;
continue;
}
else
goto decode_free;
}
}
av_free_packet(&pkt);
}
decode_free:
av_free_packet(&pkt);
return NULL;
decode_success:
return decode_frame;
}

  1. 解碼完成之后釋放
    int decode_release() { avcodec_close(video_dec_ctx); avformat_close_input(&ifmt_ctx); if(decode_frame!=NULL) { av_frame_free(&decode_frame); decode_frame = NULL; } }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末无拗,一起剝皮案震驚了整個(gè)濱河市带到,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌英染,老刑警劉巖揽惹,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異四康,居然都是意外死亡搪搏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門箭养,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慕嚷,“玉大人,你說我怎么就攤上這事『燃欤” “怎么了嗅辣?”我有些...
    開封第一講書人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挠说。 經(jīng)常有香客問我腺办,道長(zhǎng)低缩,這世上最難降的妖魔是什么粉楚? 我笑而不...
    開封第一講書人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任亿汞,我火速辦了婚禮,結(jié)果婚禮上杆兵,老公的妹妹穿的比我還像新娘雁仲。我一直安慰自己,他們只是感情好琐脏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開白布攒砖。 她就那樣靜靜地躺著,像睡著了一般日裙。 火紅的嫁衣襯著肌膚如雪吹艇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評(píng)論 1 291
  • 那天昂拂,我揣著相機(jī)與錄音受神,去河邊找鬼。 笑死格侯,一個(gè)胖子當(dāng)著我的面吹牛鼻听,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播联四,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼精算,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了碎连?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤驮履,失蹤者是張志新(化名)和其女友劉穎鱼辙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玫镐,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倒戏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恐似。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杜跷。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葛闷,到底是詐尸還是另有隱情憋槐,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布淑趾,位于F島的核電站阳仔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扣泊。R本人自食惡果不足惜近范,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望延蟹。 院中可真熱鬧评矩,春花似錦、人聲如沸阱飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俯萌。三九已至果录,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咐熙,已是汗流浹背弱恒。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棋恼,地道東北人返弹。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像爪飘,于是被迫代替她去往敵國(guó)和親义起。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容