ogg vorbis 文件的无损连接

ogg vorbis 文件的无损连接

我有几个 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

来源:https://trac.ffmpeg.org/wiki/Concatenate

答案2

你可能想看看FFmpeg。它有很多我不太理解的工具,但我记得文档有一种工具可以做到这一点。否则,我认为你可以使用VLC 媒体播放器命令行

相关内容