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