我有几个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文件,但不重新编码它们,并且每个输出只有一个流?哪个工具可以完成这项工作?