我有几个 ogg vorbis 文件,它们都使用完全相同的属性进行编码,我想将它们连接成一个文件。
我知道 ogg vorbis 格式支持多个文件的简单连接,例如:
$ cat file1.ogg file2.ogg > output.ogg
但遗憾的是,并非所有播放器都能理解这样创建的文件,例如我的移动音频播放器,我避免购买新的播放器。其他不理解它的程序是 gstreamer。如果输入的 ogg 文件恰好都具有相同的流 ID,则该方法也不起作用。
此外,由于我想丢弃原始文件并仅保留连接版本,因此我希望连接能够无损地完成,就像cat
解决方案一样。
我还想避免将文件合并为无损格式(如 flac),因为这会不必要地增加文件大小。如果可以的话,我可以保留原始 ogg 文件,这样占用的空间会更少。
ffmpeg 似乎有时可以使用连接解复用器:
$ cat inputs.txt
file 'in1.ogg'
file 'in2.ogg'
$ ffmpeg -f concat -i inputs.txt -c copy out.ogg
如果我查看输入文件的原始十六进制转储,则可以找到输出文件中准确表示的 Vorbis 数据包。因此我猜实际上没有发生重新编码。
但这似乎并不适用于所有输入文件。有时(不确定是什么触发了这种情况),ffmpeg 会发出警告:
Non-monotonous DTS in output stream 0:0; previous: 5011328, current: 5011200; changing to 5011329. This may result in incorrect timestamps in the output file.
然后我会听到两个文件之间非常微弱的“间隙”。因此这肯定不是一个全局解决方案。
由于找不到,我尝试编写自己的工具这个 stackoverflow 问题。
有没有办法连接多个 ogg vorbis 文件,但无需重新编码,并且每个输出只有一个流?哪种工具可以完成这项工作?
答案1
ffmpeg -i "concat:ogg1.ogg|ogg2.ogg|ogg3.ogg" -c copy out.ogg
在我的系统上创建一个连接的 ogg 文件,比合并的单独文件略小一点(可能是因为共享元数据)。这听起来对我来说是一样的,所以连接应该是无损的。然而,这并没有在文件之间增加一个小的间隙。
ffmpeg -f concat -safe 0 -i ogg1.ogg -i ogg2.ogg -c copy out.ogg
应该可以工作,但是从 3.3.2 开始,我的 Homebrew (macOS) ffmpeg 会出现此错误。
[concat @ 0x7f91e8800400] Line 1: unknown keyword 'OggS'
ogg1.ogg: Invalid data found when processing input