关于 ffmpeg sdk 官方示例的问题

2022-03-27 21:22:11 +08:00
 xQmQ

初次使用 ffmpeg sdk 开发,如有莽撞,请各位见谅

因为毕设要求,需要 ffmpeg sdk 将 mp4 转封装切分为 m3u8 。从官方示例里拿 remuxing.c 编译尝试了一下,转封装切分倒是成功了,但是 m3u8 的 #EXT-X-MEDIA-SEQUENCE 标签不是从 0 开始,而是从 36 开始,到 40 结束(但是从 0.ts 到 40.ts 都切分出来了);#EXT-X-TARGETDURATION 标签为 5

我想请教一下,如何让它可以从 0 开始呢?切片的时间如何设置呢?

以下是代码 https://gist.github.com/xQmQ/3ce63bf6a234a5b4e28977c2debb35cd

编译 gcc -o remuxing remuxing.c -lavformat -lavcodec -lavutil

执行 ./remuxing input.mp4 output.m3u8

打印的输入文件和输出文件信息 https://gist.github.com/xQmQ/89c83d9da5611de03a4922d95f9f7668

1773 次点击
所在节点    FFmpeg
5 条回复
Ptu2sha
2022-03-27 21:39:29 +08:00
-hls_list_size 0:列表最大长度
ec0
2022-03-28 02:33:29 +08:00
为什么不直接调用 ffmpeg 呢?
比如
ffmpeg -i input.mp4 output.m3u8

至于分段的问题,那是因为 hls_list_size 参数的默认值是 5 ,也就是说,不管你分了多少段,只取最后 5 段,把这个参数改成 0 就可以取所有段了

还有一个参数 hls_time ,是分段的长度,默认是 2

那么
ffmpeg -i input.mp4 output.m3u8
就相当于
ffmpeg -i input.mp4 -hls_list_size 5 -hls_time 2 output.m3u8

至于你的 remuxing.c ,想设置这两个值的话,可以在 112 行的 ret = avformat_write_header(ofmt_ctx, NULL);
前面插入两行代码

av_opt_set_int(ofmt_ctx->priv_data, "hls_list_size", 0, 0);
av_opt_set_int(ofmt_ctx->priv_data, "hls_time", 50, 0);

意思是把 hls_list_size 设置为 0 ,把 hls_time 设置为 50

参考了
https://stackoverflow.com/questions/30912542/mp4-to-hls-using-ffmpeg
xQmQ
2022-03-28 07:34:12 +08:00
@ec0 感谢

不直接使用命令行工具是因为毕设里没法直接调用,所以想着调库直接写代码,看能不能解决问题,主要就聚焦在 MP4 转 HLS 分片这里

关于代码里设置值,测试以后解决了问题了,非常感谢
tbwisk
2022-03-28 10:37:57 +08:00
@xQmQ 你代码里面加一堆花里胡哨的封装。。之后说自己写代码就是了。。。
xQmQ
2022-03-29 07:03:05 +08:00
@tbwisk #4 现在的代码就是官方示例,我到时候改改就能拿去用了哈哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843234

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX