日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

超詳細ffmpeg.c框架分析

1.環境搭建和整體工程說明

命令行輸入:-i 3.flv -vcodec copy 2_audio.mp4

超詳細ffmpeg.c框架分析

 

轉碼的CPU占有率。

超詳細ffmpeg.c框架分析

 

需要在這個目錄下,拷貝正確的SDL2.dll

超詳細ffmpeg.c框架分析

 

轉碼過程:

超詳細ffmpeg.c框架分析

 

轉碼成功后,MP4的大小要比3.flv的大一些。

超詳細ffmpeg.c框架分析

 

使用Mediainfo查看轉碼前后的對比。

超詳細ffmpeg.c框架分析

 

接下來,就詳細聊聊ffmpeg.c。

ffmpeg.c本質是是基于FFmpeg庫開發的多媒體?件轉換器(multimedia converter)。

ffmpeg.c的作?如下:

(1)轉碼:?如轉成MP3/AAC/H264/H265等等。

(2)壓縮:?如將PCM進??頻編碼,YUV進?視頻編碼。

(3)提取:?如提取?頻?件,保存為AAC,提前視頻?件,保存為H264。

(4)截取:?如從第5秒開始截取10秒的視頻。

(5)拼接:?如將多個?件視頻拼接??個?件視頻。

(6)合并:?如實現九宮格輸出。

(7)錄屏:ffmpeg可以?來錄屏,但效率不?。

 

市?是的格式???具,?部分都是基于ffmpeg.c?次開發,?如:

迅捷視頻轉換器

愛剪輯

 

2.ffmpeg框架分析

ffmpeg對應的?件

ffmpeg程序涉及的主要?件:

(1)cmdutils.c:解析命令相關的?具函數。

(2)ffmpeg_opt.c:負責解析命令?輸?的參數,以-vcodec copy的處理為例,對應了opt_video_codec函數(key-value的結構,- 接下來的字符是代表key的開始,key后?緊跟著value)。重點關注的是解析出來的信息存儲在 OptionsContext, ?如opt_video_codec函數。如下圖,是解析命令的函數調用棧。

超詳細ffmpeg.c框架分析

 

然后在處理的時候 open_output_file -> choose_encoder -> new_video_stream ->new_output_stream -> choose_encoder的時候可以獲取到對應的編碼器到底應該使?什么。

超詳細ffmpeg.c框架分析

 

ffmpeg.c:多媒體?件轉換器的主體。

ffmpeg_cuvid.c:CUDA硬件相關的加速。

ffmpeg_filter.c:filter相關。

ffmpeg_hw.c:硬件加速相關。

 

3.ffmpeg程序框架流程

(1)解析命令?

ffmpeg_parse_options 解析命令?的函數。對應的命令 const OptionDef options,例如:

{ "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg =opt_video_codec },

{ "codec", HAS_ARG | OPT_STRING | OPT_SPEC |OPT_INPUT | OPT_OUTPUT, { .off =OFFSET(codec_names) },"codec name", "codec" },

(2)打開輸??件 open_input_file

avformat_open_input。

分析碼流 avformat_find_stream_info。

查找對應的編碼器。

(3)打開輸出?件 open_output_file

avformat_alloc_output_context2 先建?個輸出?件。

avformat_new_stream 新建?個steam。

(4)讀取輸??件

av_read_frame 讀取輸??件。

(5)解碼編碼

解碼:avcodec_send_packet和avcodec_receive_frame。

編碼:avcodec_send_frame和avcodec_receive_packet。

(6)寫?輸出?件

avformat_write_header寫?頭部。

av_interleaved_write_frame 交替寫?packet。

av_write_trailer 寫?尾部。

 

4.框圖分析

接下來主要分析transcode()。

超詳細ffmpeg.c框架分析

 

transcode_init():轉碼的初始化?作。

check_keyboard_interaction():檢測鍵盤操作。?如轉碼的過程中按下“q”鍵之后,會退出轉碼,該函數內還有?些其他的按鍵處理,具體看函數實現也是挺簡單的。

transcode_step():進?轉碼

print_report():打印轉碼信息,輸出到屏幕上,如下信息:

超詳細ffmpeg.c框架分析

 

flush_encoder():輸出編碼器中剩余的幀。

當中check_keyboard_interaction(),transcode_step(),print_report()三個函數位于?個循環之中會不斷地運?

transcode_init()調?了以下?個重要的函數:

(1)init_input_stream():當中調?了avcodec_open2()打開編碼器。

(2)init_output_stream()。

(3)av_dump_format()在屏幕上打印輸出格式信息。注意是輸出格式的信息。輸?格式的信息的打印是在parse_options()函數運?過程中調?opt_input_file()的時候打印到屏幕上。

(4)avformat_write_header():寫輸出?件的?件頭。

 

transcode_step()調?了例如以下函數:

(1)process_input():完成解碼?作。

(2)transcode_from_filter():未分析。

(3)reap_filters():完成編碼?作。

(4)process_input()流程圖如下所示:

超詳細ffmpeg.c框架分析

 

get_input_packet():獲取?幀壓縮編碼數據,即?個AVPacket。當中調?了av_read_frame()。

output_packet():解碼壓縮編碼的數據并將之送?AVFilterContext。

output_packet()調?了例如以下函數:

decode_video():解碼?幀視頻(?個AVPacket)。

decode_audio():解碼?頻(并不?定是?幀,是?個AVPacket)。

do_streamcopy():假設不需要??次編碼的話,則調?此函數,?般?于封裝格式之間的轉換。速度?轉碼快?常多

decode_video()調?了例如以下函數:

avcodec_decode_video2():解碼?幀視頻。

rate_emu_sleep():要求依照幀率處理數據的時候調?。能夠避免FFmpeg處理速度過快。經常使?于?絡實時流的處理(RTP/RTMP流的推送)。

configure_filtergraph():設置AVFilterGraph。

av_buffersrc_add_frame():將解碼后的數據(?個AVFrame)送?AVFilterContext。

decode_audio()調?的函數和decode_video()基本?樣。唯?的不同在于其解碼?頻的函數是avcodec_decode_audio4()。

reap_filters():主要完成了編碼的工作。

其函數調?結構例如以下圖:

超詳細ffmpeg.c框架分析

 

reap_filters()調?了例如以下函數:

av_buffersink_get_buffer_ref():從AVFilterContext中取出?幀解碼后的數據(結構為AVFilterBufferRef。能夠轉換為AVFrame)。

avfilter_copy_buf_props():AVFilterBufferRef轉換為AVFrame。

do_audio_out():編碼?頻。

do_video_out():編碼視頻。do_video_out()調?了例如以下函數:

avcodec_encode_video2():編碼?幀視頻。

write_frame():寫?編碼后的視頻壓縮數據。

write_frame()調?了例如以下函數:

av_bitstream_filter_filter():使?AVBitStreamFilter的時候。會調?此函數進?處理。

av_interleaved_write_frame():寫?壓縮編碼數據。

avfilter_unref_buffer():釋放資源。

do_audio_out()調?的函數與do_video_out()基本上?樣。唯?的不同在于視頻編碼函數。

avcodec_encode_video2()變成了?頻編碼函數avcodec_encode_audio2()。

 

exit_program()主要完成了清理?作。調?關系例如以下圖:

超詳細ffmpeg.c框架分析

 

調?了如以下函數:

avfilter_graph_free():釋放AVFilterGraph。

avformat_free_context():釋放輸出?件的AVFormatContext。

av_bitstream_filter_close():關閉AVBitStreamFilter。

avformat_close_input():關閉輸??件。

 

4.附加部分

(1)解析命令行ffmpeg_parse_options。

(2)打開輸入文件。

(3)打開輸出文件。

(4)讀取輸入文件,av_read_frame。函數調用棧如下:

超詳細ffmpeg.c框架分析

 

(5)編解碼

解碼:avcodec_send_packet。

編碼:avcode_send_frame。

解碼video:

超詳細ffmpeg.c框架分析

 


超詳細ffmpeg.c框架分析

 

解碼audio:

超詳細ffmpeg.c框架分析

 

(6)將packet寫入輸出文件

avformat_write_header:寫入頭部。

av_interleaved_write_frame:寫入packet。

av_write_trailer:寫入尾部。

超詳細ffmpeg.c框架分析

 

本篇文章就分享到這里,歡迎關注,點贊,轉發,收藏。

分享到:
標簽:框架 ffmpeg
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定