我在浏览器中有一个使用 ffmpeg (WebAssembly) 的音频编辑器,我想将新音频插入到现有音频中,而不必重新编码所有内容。重新编码所有内容需要很长时间,尤其是在浏览器中,因此我只想重新编码插入的文件,将其与原始文件匹配并使用
copy
命令将它们连接起来。
在 ffmpeg 连接 docs 上它说:
所有文件必须具有相同的流(相同的编解码器、相同的时基等)
但是不清楚时基是什么意思。到目前为止,我观察到我需要匹配:
是否还有其他需要匹配的内容,以便连接时生成的音频不会损坏/损坏?
我观察过 mp3,例如它有 VBR、CBR 和 ABR。如果原始音频的比特率为 128 kb/s,我假设它是 CBR,所以我将其与:
ffmpeg -i original.mp3
# > Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
ffmpeg -i input.mp3 -b:a 128k -ar 44100 -ac 2 re_encoded.mp3
# then merge
# concat_list.txt contains the original audio and the re_encoded.mp3
ffmpeg -f concat -i concat_list.txt -safe 0 -c copy merged.mp3
这对于 CBR 来说效果很好,例如 8、16、24、32、40、48、64、80、96、112、128、160、192、224、256 或 320(docs),只要我测试过。
问题在于原始 .mp3 具有 VBR(可变比特率)或 ABR,例如 150 kb/s。
如果我尝试像下面这样匹配它:
ffmpeg -i input.mp3 -b:a 150k -ar 44100 -ac 2 re_encoded.mp3
ffmpeg -i re_encoded.mp3
# Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 160 kb/s
生成的比特率四舍五入到最接近的 CBR,即 160。
我可以使用
-abr 1
: 用 mp3 解决这个问题
ffmpeg -i input.mp3 -abr 1 -b:a 150k -ar 44100 -ac 2 re_encoded.mp3
ffmpeg -i re_encoded.mp3
# Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 150 kb/s
现在比特率与原始音频匹配,但是我不确定这是否正确,因为我正在将新音频修改为 ABR 并将其与 VBR 连接?我什至不确定如何使用 ffmpeg 检查音频是 VBR、CBR 还是 ABR,或者在连接时是否很重要。
aac 文件也会出现另一个问题。当我尝试匹配原始音频比特率时,我做不到。
ffmpeg -i input.mp3 -b:a 128k -ar 44100 -ac 2 re_encoded.aac
ffmpeg -i re_encoded.aac
# Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 135 kb/s
生成的比特率似乎总是可变的(在本例中为 135),因此我无法将其与原始比特率相匹配。
所以我的问题是,将音频与不同的流连接时需要满足什么条件,以及如何实现仅重新编码一个音频以匹配另一个音频。或者如果有一些包可以做到这一点,那就会有很大的帮助。
您需要匹配编解码器、通道数和采样率。您不需要匹配比特率。解码器将以不同的比特率工作,就像任何其他 VBR 流一样。每个框架都可以指示其大小。对于 CBR,所有帧的大小恰好相同。 但实际上,您不会想为此烦恼。您将需要将所有内容解码为原始 PCM 并重新编码。虽然这确实会导致一代人的损失,但好处是显而易见的:
样本精确计时需要以能够实际分割样本的格式进行拼接。您无法使用以块(即帧)工作的有损编解码器来做到这一点。