ffmpeg源碼分析2-av_find_best_stream

CSDN 原文:https://blog.csdn.net/wangcong02345/article/details/52441847

1. av_find_best_stream

a. 就是要獲取音視頻及字幕的流索引stream_index

b.以前沒有函數(shù)av_find_best_stream時涵卵,獲取索引可以通過如下

for(i=0; i<is->pFormatCtx->nb_streams; i++)
    { 
        if(is->pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
        {
            is->videoindex= i;
        }
        if(is->pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
        {
            is->sndindex= i;
        }
    }

2.video及audio的調(diào)用如下:

 ic     type              wanted_stream_nb            related_stream             decoder_ret flag
st_index[AVMEDIA_TYPE_VIDEO] = 
   av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, st_index[AVMEDIA_TYPE_VIDEO],  -1,                         NULL,      0);
st_index[AVMEDIA_TYPE_AUDIO] =
   av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO, st_index[AVMEDIA_TYPE_AUDIO],st_index[AVMEDIA_TYPE_VIDEO], NULL,      0);

3.說明

int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream,
                        AVCodec **decoder_ret, int flags)
{
    int i, nb_streams = ic->nb_streams;
    int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
    unsigned *program = NULL;
    const AVCodec *decoder = NULL, *best_decoder = NULL;

 //沒看到有什么作用筋栋,即參數(shù)related_stream在這兒沒有用
    if (related_stream >= 0 && wanted_stream_nb < 0) {                 
        AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
        if (p) {
            program = p->stream_index;
            nb_streams = p->nb_stream_indexes;
        }
    }
//對于只有音頻與視頻流的媒體文件來說
    for (i = 0; i < nb_streams; i++) {                                   
        nb_streams=2
 //program=NULL,所以real_stream_index=i;
        int real_stream_index = program ? program[i] : i;               
        AVStream *st = ic->streams[real_stream_index];
        AVCodecContext *avctx = st->codec;
 //以下三個if是過濾條件
        if (avctx->codec_type != type)                                    
            continue;
        if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
            continue;
        if (wanted_stream_nb != real_stream_index &&
            st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED |
                               AV_DISPOSITION_VISUAL_IMPAIRED))
            continue;
        if (type == AVMEDIA_TYPE_AUDIO && !(avctx->channels && avctx->sample_rate))
            continue;
 //decoder_ret=NULL,所以下面這個find_decoder也沒有調(diào)用
        if (decoder_ret) {                                         
            decoder = find_decoder(ic, st, st->codec->codec_id);
            if (!decoder) {
                if (ret < 0)
                    ret = AVERROR_DECODER_NOT_FOUND;
                continue;
            }
        }
        count = st->codec_info_nb_frames;
        bitrate = avctx->bit_rate;
        if (!bitrate)
            bitrate = avctx->rc_max_rate;
        multiframe = FFMIN(5, count);
        if ((best_multiframe > multiframe) ||
            (best_multiframe == multiframe && best_bitrate > bitrate) ||
            (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
            continue;
        best_count = count;
        best_bitrate = bitrate;
        best_multiframe = multiframe;
//到這兒real_stream_index就是匹配了三個if的index了,不匹配的都continue了
        ret = real_stream_index;                                  
        best_decoder = decoder;
        if (program && i == nb_streams - 1 && ret < 0) {
            program = NULL;
            nb_streams = ic->nb_streams;
            /* no related stream found, try again with everything */
            i = 0;
        }
    }
    if (decoder_ret)
        *decoder_ret = (AVCodec*)best_decoder;
    return ret;  //返回就完事了
}


av_find_best_stream函數(shù)其實跟以前實現(xiàn)思路是一樣的然眼,只不過這兒的條件更多一點而己掘托。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琅坡,一起剝皮案震驚了整個濱河市鸯旁,隨后出現(xiàn)的幾起案子忆植,更是在濱河造成了極大的恐慌,老刑警劉巖法褥,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茫叭,死亡現(xiàn)場離奇詭異,居然都是意外死亡半等,警方通過查閱死者的電腦和手機揍愁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杀饵,“玉大人莽囤,你說我怎么就攤上這事∏芯啵” “怎么了朽缎?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我话肖,道長北秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任最筒,我火速辦了婚禮贺氓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘床蜘。我一直安慰自己辙培,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布邢锯。 她就那樣靜靜地躺著扬蕊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弹囚。 梳的紋絲不亂的頭發(fā)上厨相,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音鸥鹉,去河邊找鬼蛮穿。 笑死,一個胖子當著我的面吹牛毁渗,可吹牛的內(nèi)容都是我干的践磅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灸异,長吁一口氣:“原來是場噩夢啊……” “哼府适!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肺樟,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤檐春,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后么伯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疟暖,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年田柔,在試婚紗的時候發(fā)現(xiàn)自己被綠了俐巴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡硬爆,死狀恐怖欣舵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缀磕,我是刑警寧澤缘圈,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布劣光,位于F島的核電站,受9級特大地震影響糟把,放射性物質(zhì)發(fā)生泄漏赎线。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一糊饱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颠黎,春花似錦另锋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至过椎,卻和暖如春室梅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疚宇。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工亡鼠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敷待。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓间涵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榜揖。 傳聞我的和親對象是個殘疾皇子勾哩,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,697評論 0 3
  • Android音頻系統(tǒng)詳解 參考好文: Android 音頻系統(tǒng):從 AudioTrack 到 AudioFlin...
    愛雨520閱讀 13,578評論 2 7
  • 在上一篇筆記中我們已經(jīng)完成了使用SDL播放聲音和視頻,聲音播放沒有什么問題举哟,而視頻播放太快思劳,很明顯視頻沒有同步。在...
    762683ff5d3d閱讀 1,325評論 0 1
  • FFmpeg 介紹 FFmpeg是一套可以用來記錄妨猩、轉(zhuǎn)換數(shù)字音頻潜叛、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序册赛。采用LG...
    Y了個J閱讀 11,282評論 0 28
  • 凌晨3:20 醒來 可能年紀大了钠导,就算晚上再晚睡,早上還是會很早醒來 早上6:30 起床 刷牙 洗臉 ...
    肉奚閱讀 168評論 2 1