web-dev-qa-db-ja.com

oggvorbisファイルのロスレス連結

私はいくつかのoggvorbisファイルを持っており、それらはすべて、単一のファイルに連結したいのとまったく同じプロパティでエンコードされています。

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

入力ファイルの生の16進ダンプを見ると、出力ファイルに正確に表されている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.

そして、2つのファイルの間に非常にかすかな「ギャップ」が聞こえます。したがって、これは確かにグローバルなソリューションではありません。

見つからなかったので、 このstackoverflowの質問 で自分のツールを書こうとしました。

複数のoggvorbisファイルを連結する方法はありますが、それらを再エンコードせずに、出力ごとに1つのストリームのみを使用しますか?どのツールがその仕事をすることができますか?

12
josch

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
user396762

FFmpeg をご覧ください。よくわからないツールがたくさんありますが、 ドキュメント から、これを正確に行うためのツールがあることを覚えています。それ以外の場合は、 VLC Media Playerコマンドライン を使用できると思います。

0
NatoBoram