欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

FFmpeg?Principle學(xué)習(xí)new_video_stream添加視頻輸出流

 更新時(shí)間:2022年10月29日 16:13:46   作者:Loken1  
這篇文章主要為大家介紹了FFmpeg?Principle學(xué)習(xí)new_video_stream添加視頻輸出流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

new_video_stream() 函數(shù)流程

new_video_stream() 函數(shù)的流程相對(duì)來說比較簡單,主要的邏輯如下:

1, 調(diào) new_output_stream() 函數(shù)來創(chuàng)建 OutputStream 輸出流,以及 AVCodecContext 編碼器上下文。

new_output_stream() 是一個(gè)公共函數(shù),創(chuàng)建 音頻流,數(shù)據(jù)流,字幕流都用了它。

new_output_stream() 會(huì)把命令行的一些公共參數(shù)賦值給 OutputStream 跟 AVCodecContext。

這些公共參數(shù)是指音頻,視頻,字幕都可能會(huì)有的參數(shù)。因?yàn)?nbsp;new_output_stream() 是一個(gè)公共函數(shù)。

2, 調(diào) MATCH_PER_STREAM_OPT() 宏函數(shù),把 OptionsContext 里面視頻相關(guān)的參數(shù),賦值給 給 OutputStream 跟 AVCodecContext。

流程圖

可以看到,實(shí)際上就兩步,new_video_stream() 肯定會(huì)創(chuàng)建視頻的輸出流,還有視頻的編碼器實(shí)例。

公共參數(shù),就在 new_output_stream() 函數(shù) 里面賦值了。

視頻相關(guān)的參數(shù),就在 new_video_stream() 函數(shù)再賦值。

new_video_stream() 跟 new_output_stream() 函數(shù)都調(diào)用了多次 MATCH_PER_STREAM_OPT() 宏函數(shù)來提取 OptionsContext 的內(nèi)容,

MATCH_PER_STREAM_OPT() 其實(shí)是 MATCH_PER_TYPE_OPT() 的兄弟函數(shù),

#define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
{\
    int i;\
    for (i = 0; i < o->nb_ ## name; i++) {\
        char *spec = o->name[i].specifier;\
        if (!strcmp(spec, mediatype))\
            outvar = o->name[i].u.type;\
    }\
}
#define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
{\
    int i, ret, matches = 0;\
    SpecifierOpt *so;\
    for (i = 0; i < o->nb_ ## name; i++) {\
        char *spec = o->name[i].specifier;\
        if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0) {\
            outvar = o->name[i].u.type;\
            so = &o->name[i];\
            matches++;\
        } else if (ret < 0)\
            exit_program(1);\
    }\
    if (matches > 1)\
       WARN_MULTIPLE_OPT_USAGE(name, type, so, st);\
}

這兩個(gè)函數(shù),只有最后一個(gè)參數(shù),第四個(gè)參數(shù)是不一樣的。

mediatype 通常是 a 或者 v,也就是根據(jù) a 還是 v 字符來提取 OptionsContext 里面音頻或者視頻的選項(xiàng)。

st 是 AVStream,所以如果 AVStream 是音頻,就提取 OptionsContext 里面的音頻選項(xiàng),如果是視頻就提取視頻。

這兩個(gè)函數(shù)的宏實(shí)現(xiàn)看起來有點(diǎn)復(fù)雜,但他們的區(qū)別就是這么一點(diǎn)區(qū)別。

至此,new_video_stream() 函數(shù)分析完畢。new_audio_stream() 跟 new_video_stream() 類似,里面都調(diào)了 new_output_stream() 。

new_audio_stream() 主要是提取OptionsContext 里面音頻選項(xiàng),對(duì) OutputStream 輸出流,以及 AVCodecContext 編碼器 進(jìn)行賦值操作。

補(bǔ)充一點(diǎn):雖然 new_video_stream() 里創(chuàng)建了 編碼器實(shí)例,但是還沒真正打開編碼器的。打開編碼器,需要等到解碼出第一幀 AVFrame。才會(huì)打開編碼器。

原因解析

因?yàn)?ffmpeg.exe 的邏輯,是只有在解碼出第一幀AVFrame的時(shí)候,才去用 avfilter_graph_config() 打開 FilterGragh ,這樣才能從出口濾鏡讀取到 輸出的寬高是多少。

ffmpeg.exe 比較謹(jǐn)慎,他可能不太相信容器層記錄的寬度,也有可能有些容器根本沒記錄寬高,所以他必須等到解碼出 AVFrame,才能確定輸入的寬高,確定了輸入的寬高,才能創(chuàng)建 buffer入口濾鏡,創(chuàng)建了入口濾鏡,才能打開 FilterGragh 。

TODO:這個(gè)邏輯非常重要,在本章結(jié)尾的時(shí)候再重復(fù)講一次。

濾鏡出口里面獲取寬高

最后是在 init_output_stream_encode() 里面,從濾鏡出口里面獲取的寬高,如下:

enc_ctx->width  = av_buffersink_get_w(ost->filter->filter);
enc_ctx->height = av_buffersink_get_h(ost->filter->filter);
enc_ctx->sample_aspect_ratio = ost->st->sample_aspect_ratio

最后,推薦一下 clion 的 Call Hierarchy 功能,可以看到函數(shù)的調(diào)用流程,如下:

大部分的 集成開發(fā)環(huán)境都有這個(gè)功能,你只需用 “工具名稱” + Call Hierarchy 關(guān)鍵詞,即可搜索到相關(guān)教程。

以上就是FFmpeg Principle學(xué)習(xí)new_video_stream添加視頻輸出流的詳細(xì)內(nèi)容,更多關(guān)于FFmpeg Principle new_video_stream的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • autojs模仿QQ長按彈窗菜單實(shí)現(xiàn)示例詳解二

    autojs模仿QQ長按彈窗菜單實(shí)現(xiàn)示例詳解二

    這篇文章主要為大家介紹了autojs模仿QQ長按彈窗菜單實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android編程實(shí)現(xiàn)可滑動(dòng)的開關(guān)效果(附demo源碼下載)

    Android編程實(shí)現(xiàn)可滑動(dòng)的開關(guān)效果(附demo源碼下載)

    這篇文章主要介紹了Android編程實(shí)現(xiàn)可滑動(dòng)的開關(guān)效果,涉及Android的布局與控件設(shè)置技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-04-04
  • Android自定義控件實(shí)現(xiàn)球賽比分條效果

    Android自定義控件實(shí)現(xiàn)球賽比分條效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)球賽比分條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 使用RadioButton+Fragment實(shí)現(xiàn)底部導(dǎo)航欄效果

    使用RadioButton+Fragment實(shí)現(xiàn)底部導(dǎo)航欄效果

    這篇文章主要為大家詳細(xì)介紹了使用RadioButton+Fragment實(shí)現(xiàn)底部導(dǎo)航欄效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android計(jì)步功能的實(shí)現(xiàn)代碼

    Android計(jì)步功能的實(shí)現(xiàn)代碼

    本篇文章主要介紹了Android計(jì)步功能的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Android利用軟引用和弱引用避免OOM的方法

    Android利用軟引用和弱引用避免OOM的方法

    Java從JDK1.2版本開始,就把對(duì)象的引用分為四種級(jí)別,從而使程序能更加靈活的控制對(duì)象的生命周期。這四種級(jí)別由高到低依次為:強(qiáng)引用、軟引用、弱引用和虛引用。本文給大家介紹Android利用軟引用和弱引用避免OOM,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • Android實(shí)現(xiàn)短視頻畫心效果

    Android實(shí)現(xiàn)短視頻畫心效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)短視頻畫心效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    這篇文章主要給大家介紹了關(guān)于Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面來一起看看吧。
    2017-05-05
  • Android使用IntentService進(jìn)行apk更新示例代碼

    Android使用IntentService進(jìn)行apk更新示例代碼

    這篇文章主要介紹了Android使用IntentService進(jìn)行apk更新示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Android AlertDialog多種創(chuàng)建方式案例詳解

    Android AlertDialog多種創(chuàng)建方式案例詳解

    這篇文章主要介紹了Android AlertDialog多種創(chuàng)建方式案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論