ogg vorbis文件的无损串联


12

我有几个ogg vorbis文件,所有文件的编码属性都与我想连接到一个文件中的属性完全相同。

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

$ cat file1.ogg file2.ogg > output.ogg

但是可悲的是,并不是所有播放器都能理解这样创建的文件,例如我的移动音频播放器,而我会避免购买新的文件。其他不了解它的程序是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

如果查看输入文件的原始hexdump,则可以找到输出文件中确切表示的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文件,但不重新编码它们,并且每个输出只有一个流?哪个工具可以完成这项工作?



@JoshRumbut是的,并且它存在包含可听间隙的问题,在这些间隙中文件被
合并

您可以尝试使用PiTiVi并将片段顺序放置在时间轴上。
harrymc '16

1
OP(我也是如此)想要一个程序化的解决方案,该方案不涉及收集所需文件后的用户交互。
Villermen

2
@RalphRönnquistSox重新编码输入。
josch 2016年

Answers:


2

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


我遇到了同样的错误
Housemd

0

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


1
您能否扩大答案?仅指向产品及其文档并不能真正说明如何完成该解决方案。最好在此处包括一些有关如何使用产品解决问题的说明。有关推荐软件的良好指导,请访问:meta.superuser.com/questions/5329/…。谢谢。
fixer1234 '16

仅使用ffmpeg -f concat -i inputs.txt -c copy out.ogg不起作用。我很好奇您认为使用ffmpeg可以解决此问题。
josch 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.