日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ffmpeg.c学习-1-框架分析及命令行解析

發(fā)布時(shí)間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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" },/* data codec support */{ "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 交替寫?packet
  • av_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;// 輸入和輸出的命令分組 (groups[0] 存儲(chǔ)與輸出文件相關(guān)參數(shù),groups[1] 存儲(chǔ)與輸入文件相關(guān)參數(shù))OptionGroupList *groups;int nb_groups;/* 臨時(shí)數(shù)組,存儲(chǔ)輸出、輸入相關(guān)參數(shù) parsing state */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ò),歡迎將生活随笔推薦給好友。