ogg vorbis 文件的无损连接

jos*_*sch 14 audio ogg vorbis cat lossless

我有几个 ogg vorbis 文件,所有文件都使用我想要连接到单个文件的完全相同的属性进行编码。

我知道 ogg vorbis 格式支持多个文件的简单连接,例如:

$ cat file1.ogg file2.ogg > output.ogg
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,并非所有播放器都能理解这样创建的文件,例如我的移动音频播放器,我会避免购买新的。其他不理解它的程序是 gstreamer。如果输入的 ogg 文件碰巧都具有相同的流 ID,则该方法也不起作用。

此外,由于我想扔掉原始文件并只保留连接的版本,因此我希望像cat解决方案一样无损地完成连接。

我还想避免将文件连接成像 flac 这样的无损格式,因为这会不必要地增加文件大小。如果那没问题,那么我可以保留原始的 ogg 文件并使用更少的空间。

似乎 ffmpeg 有时可以使用concat demuxer来做到这一点:

$ cat inputs.txt
file 'in1.ogg'
file 'in2.ogg'
$ ffmpeg -f concat -i inputs.txt -c copy out.ogg
Run Code Online (Sandbox Code Playgroud)

如果我查看输入文件的原始十六进制转储,那么我可以找到在输出文件中准确表示的 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.
Run Code Online (Sandbox Code Playgroud)

然后我会听到两个文件之间非常微弱的“间隙”。因此,这当然不是全球解决方案。

由于找不到,我尝试在此 stackoverflow question 中编写自己的工具。

有没有办法连接多个 ogg vorbis 文件但不重新编码它们并且每个输出只有一个流?哪个工具能够完成这项工作?

小智 6

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 应该可以工作,但它在我的 Homebrew (macOS) ffmpeg 上从 3.3.2 开始出现此错误。

[concat @ 0x7f91e8800400] Line 1: unknown keyword 'OggS'
ogg1.ogg: Invalid data found when processing input
Run Code Online (Sandbox Code Playgroud)

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


小智 0

您可能想看一下FFmpeg。它有很多我不太理解的工具,但我从文档中记得有一个工具可以做到这一点。否则,我认为你可以使用VLC Media Player命令行

  • 仅使用“ffmpeg -f concat -i input.txt -c copy out.ogg”不起作用。我很好奇你认为如何用 ffmpeg 解决这个问题。 (3认同)
  • 你能扩大一下你的答案吗?仅指出产品及其文档并不能真正解释如何完成解决方案。最好在此处包含一些有关如何使用该产品解决问题的说明。关于推荐软件的良好指南:http://meta.superuser.com/questions/5329/how-do-i-recommend-software-in-my-answers。谢谢。 (2认同)