ffmpeg - 从 MP3 创建碎片化的 MP4
问题描述
我正在尝试将 MP3 文件转换为碎片化的 MP4,如下所示:
ffmpeg -i input.mp3 -strict experimental -acodec aac -b:a 256k -f mp4 \
-movflags faststart+frag_keyframe+empty_moov+separate_moof output.mp4
然而,使用Bento4 ,我可以看到只有一个巨大mdat
的物体,而不是一系列的:
[ftyp] size=8+24
major_brand = isom
minor_version = 200
compatible_brand = isom
compatible_brand = iso2
compatible_brand = iso6
compatible_brand = mp41
[moov] size=8+701
...
[moof] size=8+62364
...
[mdat] size=8+5794679
[mfra] size=8+59
[tfra] size=12+31, version=1
track_ID = 1
length_size_of_traf_num = 0
length_size_of_trun_num = 0
length_size_of_sample_num = 0
[mfro] size=12+4
mfra_size = 67
我想我想要的是这样的:
(来源)
但我似乎无法从ffmpeg
.
我在这里找到了一些其他选项,例如
$ ffmpeg -h muxer=ismv
...
-frag_duration <int> E.... Maximum fragment duration
-min_frag_duration <int> E.... Minimum fragment duration
-frag_size <int> E.... Maximum fragment size
但是玩这些并没有改变输出。
如何创建特定片段的片段,例如每个片段约 5 秒?
解决方案
音频流没有关键帧,这是 MP4 muxer 默认依赖的来划分片段边界。您必须设置片段持续时间。
ffmpeg -i input.mp3 -c:a aac -b:a 256k -f mp4 -movflags +empty_moov+separate_moof -frag_duration 10M output.mp4
笔记:
faststart
适用于常规的非分段输出frag_keyframe
告诉 ffmpeg 在视频关键帧处开始片段,但您没有视频流。-strict experimental
自 2016 年以来,原生 AAC 编码器不再需要。frag_duration
期望以微秒为单位的值。10M
= 1000 万 = 10 秒。
推荐阅读
- javascript - 只渲染一次组件的逻辑
- mysql - Laravel:我的表有整数作为列名,我无法使用 laravel elequent 更新数据?
- python - Python 正则表达式有问题:打印“匹配”时打印“无”。正则表达式在测试器中工作
- python - Python - 从索引值中删除引号
- flutter - FakeAsync 和 quiver.testing.async 有什么区别?
- c# - Unity 2019.2.11f1 中的所有代码命令是否有字典或摘要?
- c++ - C++ 指针在 for 循环中被覆盖
- nginx - 如何配置 nginx 部署以将流量传递到 Google Kubernetes Engine 中的前端部署?
- swift - 为 imageview 创建通用变量以添加 uipangesture
- python - 理解困难