生活随笔
收集整理的這篇文章主要介紹了
ffmpeg.c学习-1-框架分析及命令行解析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ffmpeg.c學(xué)習(xí)-1-框架分析及命令行解析
目錄
掌握ffmpeg.c的意義ffmpeg框架分析 ffmpeg對應(yīng)的?件ffmpeg程序框架流程 命令行解析
1. 掌握ffmpeg.c的意義
ffmpeg.c本質(zhì)是是基于FFmpeg庫開發(fā)的多媒體?件轉(zhuǎn)換器(multimedia converter)。ffmpeg.c的作? 轉(zhuǎn)碼:?如轉(zhuǎn)成MP3/AAC/H264/H265等等;壓縮:?如將PCM進(jìn)??頻編碼,YUV進(jìn)?視頻編碼;提取:?如提前?頻?件為AAC,提前視頻?件為H264;截取:?如從第5秒開始截取10秒的視頻;拼接:?如將多個(gè)?件拼接??個(gè)?件;合并:?如實(shí)現(xiàn)九宮格輸出;錄屏:ffmpeg可以?來錄屏,但效率不?。 市?是的格式???具,?部分都是基于ffmpeg.c?次開發(fā),?如: 迅捷視頻轉(zhuǎn)換器愛剪輯等等 掌握ffmpeg.c對于我們深?掌握FFmpeg?常有必要。
2. ffmpeg框架分析
1. ffmpeg對應(yīng)的?件
ffmpeg程序涉及的主要?件: cmdutils.c:解析命令相關(guān)的?具函數(shù),不?太關(guān)注先;ffmpeg_opt.c:負(fù)責(zé)解析命令?輸?的參數(shù),以-vcodec copy的處理為例,對應(yīng)了opt_video_codec函數(shù)(key-value的結(jié)構(gòu),-接下來的字符是代表key的開始,key后?緊跟著value) 我們重點(diǎn)關(guān)注的是解析出來的信息存儲(chǔ)在 OptionsContext, ?如opt_video_codec函數(shù)
然后在處理的時(shí)候 open_output_file -> choose_encoder -> new_video_stream ->new_output_stream -> choose_encoder的時(shí)候可以獲取到對應(yīng)的編碼器到底應(yīng)該使?什么。
ffmpeg.c:多媒體?件轉(zhuǎn)換器的主體;ffmpeg_cuvid.c:CUDA硬件相關(guān)的加速;ffmpeg_filter.c:filter相關(guān);ffmpeg_hw.c:硬件加速相關(guān)
2. ffmpeg程序框架流程
先忽略含有filter的情況。解析命令? ffmpeg_parse_options 解析命令?的函數(shù)對應(yīng)的命令 const OptionDef options,例如
{ "vcodec", OPT_VIDEO
| HAS_ARG
| OPT_PERFILE
| OPT_INPUT
| OPT_OUTPUT
, { .func_arg
= opt_video_codec
}, "force video codec ('copy' to copy stream)", "codec" },{ "dcodec", HAS_ARG
| OPT_DATA
| OPT_PERFILE
| OPT_EXPERT
| OPT_INPUT
| OPT_OUTPUT
,{ .func_arg
= opt_data_codec
}, "force data codec ('copy' to copy stream)", "codec" },
打開輸??件 open_input_file avformat_open_input分析碼流 avformat_find_stream_info查找對應(yīng)的編碼器 打開輸出?件 open_output_file avformat_alloc_output_context2 先建?個(gè)輸出?件avformat_new_stream 新建?個(gè)steam 讀取輸??件 av_read_frame 讀取輸??件 解碼編碼 解碼:avcodec_send_packet和avcodec_receive_frame編碼:avcodec_send_frame和avcodec_receive_packet 寫?輸出?件 avformat_write_header寫?頭部av_interleaved_write_frame 交替寫?packetav_write_trailer 寫?尾部
3. 命令行解析
1. FFmpeg 命令?基礎(chǔ)語法:
ffmpeg
[global_options
] {[input_file_options
] -i input_file
}...{[output_file_options
] output_file
}...
global_options:全局參數(shù)input_file_options:輸??件相關(guān)參數(shù)output_file_options:輸出?件相關(guān)參數(shù)如下為?個(gè)簡單的 FFmpeg 命令,將 input.avi 視頻?件轉(zhuǎn)換為 640kbps 碼率的 output.avi
ffmpeg
-i
3.flv
-acodec
copy -vcodec libx264
-g
30 -b
500kb
3.mp4
-y
-loglevel
56
當(dāng)我們使?命令?來調(diào)? FFmpeg 時(shí),當(dāng)命令?傳? FFmpeg 時(shí),FFmpeg內(nèi)部是如何識(shí)別這些命令并進(jìn)?解析和賦值的呢?總結(jié)起來,解析命令?的?致流程就是: 跳過 “–xx xxx” 參數(shù)“-xx xxx” 格式的默認(rèn)參數(shù)存?全局參數(shù)數(shù)組或臨時(shí)參數(shù)數(shù)組“-noxx xxx”格式的參數(shù),即默認(rèn)值為“0”,將值存?全局參數(shù)數(shù)組或臨時(shí)參數(shù)數(shù)組解析專屬參數(shù),并存?專屬數(shù)組結(jié)構(gòu)體(AVDictionary)“-i xxx” 格式的輸??件路徑參數(shù),將臨時(shí)參數(shù)數(shù)組的值、輸??件路徑以及專屬參數(shù)存?輸?相關(guān)參數(shù)結(jié)構(gòu)體,并清空臨時(shí)參數(shù)數(shù)組“xxx” 格式的輸出?件路徑參數(shù),將臨時(shí)參數(shù)數(shù)組的值、輸出?件路徑以及專屬參數(shù)存?輸出相關(guān)參數(shù)結(jié)構(gòu)體,并清空臨時(shí)參數(shù)數(shù)組 有關(guān)全局參數(shù)、輸?參數(shù)、輸出參數(shù)都存儲(chǔ)到 OptionParseContext *octx 中
typedef
struct OptionParseContext
{OptionGroup global_opts
;OptionGroupList
*groups
;int nb_groups
;OptionGroup cur_group
;
} OptionParseContext
;
專屬參數(shù)會(huì)先存儲(chǔ)到 AVDictionary
AVDictionary
*codec_opts
;
AVDictionary
*format_opts
;
AVDictionary
*resample_opts
;
AVDictionary
*sws_dict
;
AVDictionary
*swr_opts
;
具體 split_commandline()函數(shù)?源碼
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生
總結(jié)
以上是生活随笔為你收集整理的ffmpeg.c学习-1-框架分析及命令行解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。