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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/11 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ffmpeg.c学习-1-框架分析及命令行解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ffmpeg.c學習-1-框架分析及命令行解析


目錄

  • 掌握ffmpeg.c的意義
  • ffmpeg框架分析
  • ffmpeg對應的?件
  • ffmpeg程序框架流程
  • 命令行解析

  • 1. 掌握ffmpeg.c的意義

  • ffmpeg.c本質是是基于FFmpeg庫開發的多媒體?件轉換器(multimedia converter)。
  • ffmpeg.c的作?
  • 轉碼:?如轉成MP3/AAC/H264/H265等等;
  • 壓縮:?如將PCM進??頻編碼,YUV進?視頻編碼;
  • 提取:?如提前?頻?件為AAC,提前視頻?件為H264;
  • 截取:?如從第5秒開始截取10秒的視頻;
  • 拼接:?如將多個?件拼接??個?件;
  • 合并:?如實現九宮格輸出;
  • 錄屏:ffmpeg可以?來錄屏,但效率不?。
  • 市?是的格式???具,?部分都是基于ffmpeg.c?次開發,?如:
  • 迅捷視頻轉換器
  • 愛剪輯等等
  • 掌握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" },/* 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
  • 查找對應的編碼器
  • 打開輸出?件 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 交替寫?packet
  • av_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;// 輸入和輸出的命令分組 (groups[0] 存儲與輸出文件相關參數,groups[1] 存儲與輸入文件相關參數)OptionGroupList *groups;int nb_groups;/* 臨時數組,存儲輸出、輸入相關參數 parsing state */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-框架分析及命令行解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。