У меня есть пара файлов ogg vorbis, все они закодированы с точно такими же свойствами, которые я хочу объединить в один файл.
Я знаю, что формат ogg vorbis поддерживает простую конкатенацию нескольких файлов, таких как:
$ cat file1.ogg file2.ogg > output.ogg
Но, к сожалению, не все плееры могут понять файлы, созданные таким образом, например, мой мобильный аудиоплеер, и я бы не стал покупать новый. Другие программы, которые этого не понимают, являются gstreamer. Этот метод также не работает, если все входные ogg-файлы имеют одинаковый идентификатор потока.
Кроме того, поскольку я хотел бы выбросить исходные файлы и сохранить только сцепленную версию, я бы хотел, чтобы объединение выполнялось без потерь, как решение cat
.
Я также хочу избежать объединения файлов в формат без потерь, например, flac, так как это излишне увеличит размер файла. Если бы это было хорошо, тогда я мог бы сохранить оригинальные файлы ogg и занимать меньше места.
Кажется, что иногда ffmpeg может сделать это, используя демультиплексор concat:
$ cat inputs.txt
file 'in1.ogg'
file 'in2.ogg'
$ ffmpeg -f concat -i inputs.txt -c copy out.ogg
Если я посмотрю на raw 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.
И тогда я услышу очень слабый "разрыв" между двумя файлами. Таким образом, это, безусловно, не глобальное решение.
Так как я не смог найти ни одного, я попытался написать свой собственный инструмент в этом вопросе о стековом потоке.
Есть ли способ объединить несколько файлов ogg vorbis, но без перекодирования их и только с одним потоком на выход? Какой инструмент способен выполнить эту работу?