ffmpeg 解碼視頻流程

引用雷神原圖:


image.png

可以看出 av_register_all() 是必備的第一步 (?)
個(gè)人可用解碼流程

av_register_all();
avcodec_register_all();
avformat_network_init();
//初始化三個(gè)
//打開視頻文件
av_format_open_input();
賦值:AVFormatContext,鏈接地址(可本地可網(wǎng)絡(luò)),AVInputFormat,AVDictionary。

int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);
后二值可NULL,返回0則打開失敗
//檢查數(shù)據(jù)流
avformat_find_stream_info();
av_find_stream_info();(棄用?)
賦值:AVFormatContext,AVDictionary

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
后值可NULL,返回小于0檢查失敗
//根據(jù)視頻流找到第一幀
av_find_best_stream();
賦值:AVFormatContext,AVMediaType,wanted_stream_nb,related_stream,AVCodec,flags。
int av_find_best_stream(AVFormatContext *ic,
                        enum AVMediaType type,
                        int wanted_stream_nb,
                        int related_stream,
                        AVCodec **decoder_ret,
                        int flags);
//舉例
if((videoStream = av_find_best_stream(spFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &pCodec, 0))< 0){
        NSLog(@"沒有找到第一個(gè)視頻流");    
}

此時(shí)已經(jīng)可以獲取第一幀數(shù)據(jù)流對(duì)應(yīng)的CodecContext

    stream = spFormatCtx ->streams[videoStream];
    spCodecCtx = stream ->codec;

打印視頻流的詳細(xì)信息

av_dump_format(spFormatCtx, videoStream, filePath, 0);
void av_dump_format(AVFormatContext *ic,
                    int index,
                    const char *url,
                    int is_output);
//打印關(guān)于輸入或輸出格式的詳細(xì)信息,例如
持續(xù)時(shí)間,比特率,流,容器,程序,元數(shù)據(jù),側(cè)數(shù)據(jù),
編解碼器和時(shí)基。

這里就可以算出幀率:fps

if(stream ->avg_frame_rate.den && stream ->avg_frame_rate.num){
  fps = av_q2d(stream->avg_frame_rate);
}else{
  fps=30.0;
//講道理這里應(yīng)該不給默認(rèn)值30的,誰也不知道是多少,給個(gè)30讓人心里覺得很安慰
}

查找解碼器

avcodec_find_decoder();
AVCodec *avcodec_find_decoder(enum AVCodecID id);
//根據(jù)上文找到第一幀數(shù)據(jù)流中的解碼器id
AVFormatContext -> steams[找到的第一幀下標(biāo)] (AVSteam) -> AVCodecContext ->codec_id

打開解碼器

avcodec_open2();
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
//最后值可NULL 返回值小于0 為打開解碼器失敗

這里就可以知道源視頻的寬高
AVCodecContext -> width;
AVCodecContext -> height;

無限讀針(用在判斷,返回下一個(gè)幀是否存在,不存在結(jié)束循環(huán),有幀,是否為視頻包,不是視頻包接著返回讀取下一幀,是視頻幀調(diào)用解包,如下個(gè)方法)

//返回下一個(gè)針
av_read_frame();
int av_read_frame(AVFormatContext *s, AVPacket *pkt);

解碼

avcodec_decode_video2();
int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
                         int *got_picture_ptr,
                         const AVPacket *avpkt);
//其中AVFrame 已經(jīng)得到下一幀,就拿改AVFrame 中 data 字段進(jìn)行轉(zhuǎn)圖片操作。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,346評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,558評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,739評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,980評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評(píng)論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,347評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,702評(píng)論 2 370

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

  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,729評(píng)論 0 3
  • 原文地址:http://blog.csdn.net/yipie/article/details/7912291 摘...
    冬的天閱讀 7,198評(píng)論 1 6
  • 摘要 該配置文件定義了支持高質(zhì)量音頻分發(fā)所需的Bluetooth?設(shè)備的要求。這些要求以終端用戶服務(wù)的方式表達(dá),并...
    公子小水閱讀 9,897評(píng)論 0 4
  • 現(xiàn)狀:現(xiàn)在視頻直播非常的火,所以在視頻直播開發(fā)中,使用的對(duì)視頻進(jìn)行遍解碼的框架顯得尤為重要了,其實(shí),這種框架蠻多的...
    ZHANG_GO閱讀 3,185評(píng)論 0 2
  • 那天從麗江回來陳宇皓就接到要調(diào)回成都的通知,他原本還想帶李賓和她女朋友一起去七星湖看看的,可惜就是崔茜鈴假期不夠,...
    春城一粟閱讀 642評(píng)論 0 1