文章插图
1.环境搭建和整体工程说明
命令行输入:-i 3.flv -vcodec copy 2_audio.mp4
文章插图
转码的CPU占有率 。
文章插图
需要在这个目录下,拷贝正确的SDL2.dll
文章插图
转码过程:
文章插图
转码成功后,MP4的大小要比3.flv的大一些 。
文章插图
使用Mediainfo查看转码前后的对比 。
文章插图
接下来,就详细聊聊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函数 。如下图,是解析命令的函数调用栈 。
文章插图
然后在处理的时候 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:硬件加速相关 。
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() 。
文章插图
transcode_init():转码的初始化?作 。
check_keyboard_interaction():检测键盘操作 。?如转码的过程中按下“q”键之后,会退出转码,该函数内还有?些其他的按键处理,具体看函数实现也是挺简单的 。
transcode_step():进?转码 。
print_report():打印转码信息,输出到屏幕上,如下信息:
文章插图
flush_encoder():输出编码器中剩余的帧 。
当中check_keyboard_interaction(),transcode_step(),print_report()三个函数位于?个循环之中会不断地运? 。
transcode_init()调?了以下?个重要的函数:
推荐阅读
- 超市促销员销售技巧有哪些
- 马超在羌人的地位 马超临终前对刘备说了些什么
- 劉寄奴酒的功效与作用
- 佛罗伦萨桌游的详细介绍
- 腰鼓是一种什么乐器 腰鼓的详细介绍
- SQL Server2000安装步骤详细介绍解读新人也会装了
- 每个算法人员都应该知道的4个超参数调试方法
- 超详细解析FFplay之数据读取线程
- 海盐奶茶做法,奶茶的详细做法
- 孕囊超过23厘米药流会怎样