本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8
本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。
命令如下:ffmpeg -i a.mp4 -c copy -f segment test_output-%d.mp4
-f segment ,ffmpeg 切分视频文件,前面加 -c copy 是为了避免重新编解码,加快切分速度。
命令行参数 -f 定义如下:
ffmpeg_opt.c 3371行
{"f", HAS_ARG | OPT_STRING | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) }, "force format", "fmt" },
命令行参数 -f segment 会赋值给 OptionsContext 的 format,想知道怎么解析然后赋值的,请看《FFmpeg 源码解析-命令行》的文章。
OptionsContext 的 format 最后用在哪里,请看下面代码:
ffmpeg_opt.c 2151行
err = avformat_alloc_output_context2(&oc, NULL, o->format, filename); // 注意 o->foramt
如上图,在申请 ouput_context (输出上下文)的时候,传递了 o->format 进去。
不得不说,ffmpeg 封装得真好,真智能,直接定义一个 segment 的 AVFormatContext,把分片逻辑都封装在 format 里面。API 调用层完全不用管,调 api函数 av_write_frame() 往 segment 的 AVFormatContext 写数据就能自动分片好了。
ffmpeg -i a.mp4 a.m3u8
这条命令 hls m3u8 的分片也是用 AVFormatContext 的方式来实现的,是 HLSContext。
版权所属:知识星球:弦外之音,QQ:2338195090。 由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。