ffmpeg 将多个音轨合并/连接到单个音频

ffmpeg 将多个音轨合并/连接到单个音频

我已经从流中下载了块部分。
这是音频流的清单:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
## Generated with https://github.com/google/shaka-packager version v2.2.0-9e9833e-release
#EXTINF:6.037,
https://dve-streams.akamaized.net/ads-1/ns-004/MjAyMA/OQ/OA/509dfa9e-8c13-4e95-81dd-9ef4d27af7ca/audio/4d8cfd0d-26b2-4869-8c5a-488199003c95/1.aac?hdntl=exp=1638041076~acl=/*~id=77f74994-2e71-474c-93ae-fa06e58a850f~data=hdntl~hmac=e37b7c6b297c9a86c98528404edbafd448addbacc327eaf5d6117082af5b63e0
#EXTINF:5.995,
https://dve-streams.akamaized.net/ads-1/ns-004/MjAyMA/OQ/OA/509dfa9e-8c13-4e95-81dd-9ef4d27af7ca/audio/4d8cfd0d-26b2-4869-8c5a-488199003c95/2.aac?hdntl=exp=1638041076~acl=/*~id=77f74994-2e71-474c-93ae-fa06e58a850f~data=hdntl~hmac=e37b7c6b297c9a86c98528404edbafd448addbacc327eaf5d6117082af5b63e0
#EXTINF:5.995,
https://dve-streams.akamaized.net/ads-1/ns-004/MjAyMA/OQ/OA/509dfa9e-8c13-4e95-81dd-9ef4d27af7ca/audio/4d8cfd0d-26b2-4869-8c5a-488199003c95/3.aac?hdntl=exp=1638041076~acl=/*~id=77f74994-2e71-474c-93ae-fa06e58a850f~data=hdntl~hmac=e37b7c6b297c9a86c98528404edbafd448addbacc327eaf5d6117082af5b63e0
#EXTINF:5.995,
https://dve-streams.akamaized.net/ads-1/ns-004/MjAyMA/OQ/OA/509dfa9e-8c13-4e95-81dd-9ef4d27af7ca/audio/4d8cfd0d-26b2-4869-8c5a-488199003c95/4.aac?hdntl=exp=1638041076~acl=/*~id=77f74994-2e71-474c-93ae-fa06e58a850f~data=hdntl~hmac=e37b7c6b297c9a86c98528404edbafd448addbacc327eaf5d6117082af5b63e0
#EXTINF:6.016,
....

此清单文件包含 1500 多个要下载的块,但为了便于示例,我仅发布其中的第一个。您必须经过身份验证(不知何故,不确定身份验证如何工作)才能下载音频文件。

根据 shaka-packager 文档,我没有看到将片段合并回整个音频文件的选项。

ffmpeg提供将文件合并/组合为一个的选项。互联网上有不同的问题和解决方案,但其中一些有效,另一些无效。我设法仅对文件首先使用这些命令:

ffmpeg.exe -i .\data\1.mp3 -i .\data\2.mp3 -i .\data\3.mp3 -i .\data\4.mp3 -filter_complex 'concat' .\data\output.aac

ffmpeg.exe -i .\data\1.mp3 -i .\data\2.mp3 -i .\data\3.mp3 -i .\data\4.mp3 -filter_complex '[0:a] [1:a] [2:1] concat=n=1:a=1 [a]' -map '[a]' .\data\output.aac

上述命令返回错误:Cannot find a matching stream for unlabeled input pad 0 on filter Parsed_concat_0

ffmpeg.exe -f concat -safe 0 -i .\data\list.txt -c copy .\data\output2.m4a

ffmpeg.exe -f concat -safe 0 -i .\data\list.txt -c:a aac -strict -2 .\data\output.m4a

list.txt的内容:

file '.\data\1.mp3'
file '.\data\2.mp3'
file '.\data\3.mp3'
file '.\data\4.mp3'

最后一个命令完成输出文件,但在终端中出现以下警告:

    Metadata:
      encoder         : Lavc58.35.100 aac
[aac @ 000001872b8db780] Estimating duration from bitrate, this may be inaccurate
    Last message repeated 1 times
[aac @ 000001872b825740] Queue input is backward in time
[ipod @ 000001872b815d40] Non-monotonous DTS in output stream 0:0; previous: 599894, current: 597717; changing to 599895. This may result in incorrect timestamps in the output file.
[ipod @ 000001872b815d40] Non-monotonous DTS in output stream 0:0; previous: 599895, current: 598741; changing to 599896. This may result in incorrect timestamps in the output file.
[ipod @ 000001872b815d40] Non-monotonous DTS in output stream 0:0; previous: 599896, current: 599765; changing to 599897. This may result in incorrect timestamps in the output file.
[aac @ 000001872b8db780] Estimating duration from bitrate, this may be inaccurate
size=     368kB time=00:00:24.87 bitrate= 121.1kbits/s speed=50.3x
video:0kB audio:362kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.443961%
[aac @ 000001872b825740] Qavg: 3319.403

我真的不太明白。我已经知道下载的片段在时长上存在一些问题,因为 4 个不同的播放器显示不同的时长(只有 VLC 播放器显示最准确)。搜索每个警告花费了我很多时间,并且显示与我的问题无关的不同解决方案。
最后一个命令的最终输出播放音频,但在中间停了两次半秒然后继续,这不是想要的结果。

我仍然检查https://trac.ffmpeg.org/wiki/Concatenate这是我错过的东西。其他帖子建议将其用作m4a输出容器,这解决了一些警告。

您能帮助我建立正确的命令来联系这些文件而不在播放时暂停吗?

答案1

下载完所有片段后,浏览器会将它们下载为 ,而.mp3不管 URL 是否以 结尾.aac。我选取了其中几个并将它们重命名为 ,并.aac假设我需要使用正确的扩展名。但这种重命名是错误的。在执行了大量尝试错误命令后,我意识到使用.mp3是可以的。并且应该忽略玩家无法识别正确持续时间的问题。

用于合并所有块的最终命令:ffmpeg.exe -f concat -safe 0 -i .\data\list.txt .\data\output.mp3

.\data\list.txt 包含所有段的路径:

file .\data\1.mp3
file .\data\2.mp3
file .\data\3.mp3
file .\data\4.mp3
...

我在这里发布了更详细的信息;https://groups.google.com/g/video-downloadhelper-q-and-a/c/8V2cRB-bcK4/m/saV_Kt25BgAJ

答案2

清单中的片段是 AAC,因此您应该将它们下载为 .aac 文件

https://dve-streams.akamaized.net/ads-1/ns-004/MjAyMA/OQ/OA/509dfa9e-8c13-4e95-81dd-9ef4d27af7ca/audio/4d8cfd0d-26b2-4869-8c5a-488199003c95/1.aac?hdntl=exp=1638041076~acl=/*~id=77f74994-2e71-474c-93ae-fa06e58a850f~data=hdntl~hmac=e37b7c6b297c9a86c98528404edbafd448addbacc327eaf5d6117082af5b63e0


拥有所有 .aac 文件后,创建一个按顺序列出各段的文本文件。

1.aac
2.aac
3.aac
...

确保最后没有空行,然后

ffmpeg -i "concatf:list.txt" -c copy out.m4a

concatf于 2021 年 7 月添加,因此您需要最新的 git master 构建。

相关内容