我想连接两个m4a
文件,一个文件长度为 20:49,另一个文件长度为 10:23。以下这一页,第一个选项是:
ffmpeg -i 'concat:file1.m4a|file2.m4a' -c copy output.m4a
它只处理第一个文件,例如标准输出显示:
size= 10921kB time=00:20:48.69
输出文件与第一个文件一样为20分钟。
第二种选择是:
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.m4a
哪里mylist.txt
:
file 'file1.m4a'
file 'file2.m4a'
此命令使用这两个文件,如标准输出所示:
size= 16339kB time=00:33:56.73
但时长不对,应该是 31:42。此外,从操作系统 (macOS) 播放时,输出文件的时长为 32:06。
如何让 FFMPEG 按照其持续时间连接两个文件?
答案1
文件的连接有时不是很直观 - 这是因为许多格式包含时间戳,可能从零开始也可能不从零开始,是连续的等等,这取决于该文件的创建和编辑历史。
这就是为什么在广播世界格式规则中,只能连接:MPEGTS(需要关注连续性计数器)或RAW(原始 PCM 或原始 h.264)。
如果可以选择重新编码,我建议你将原始文件转换为原始 PCM,如下所示
ffmpeg -i file1.m4a -c:a pcm_s16le -ac 2 -ar 48000 -f s16le file1.pcm
ffmpeg -i file2.m4a -c:a pcm_s16le -ac 2 -ar 48000 -f s16le file2.pcm
这将创建 2 个原始 PCM 文件,-ac 2
每个文件有 2 个通道(立体声),采样率为 48KHz(-ar 48000
)
您现在可以连接这些文件,例如通过cat file2.pcm >> file1.pcm
- 这将创建一个没有时间戳的文件的新原始表示,只有普通的音频样本。
要将结果重新编码为 AAC,请按照以下方式操作
ffmpeg -f s16le -ac 2 -ar 48000 -i file1.pcm -c:a aac -b:a 192K -ac 2 output.m4a
让我们详细分析一下:
- 首先我告诉 ffmpeg 打开一个原始 PCM 格式的文件(有符号的 16 位低端
-f s16le
),其中包含 2 个音频通道(-ac 2
),采样率为 48KHz(-ar 48000
)并存储在 file1.pcm 中(与 ffmpeg 一样,参数的顺序很重要) - 然后使用 AAC (
-c:a
) 和 192Kbit/s (-ba:a
) 带宽重新编码为立体声 (-ac 2
)