Ffmpegはスペースなしでオーディオを連結します

Ffmpegはスペースなしでオーディオを連結します

いくつかの m4a オーディオ ファイルを連結しようとしていますが、すべて正常に動作しているようです。

私はそのようなコマンドを使用していますffmpeg -f concat -safe 0 -i files.txt -y -af anlmdn output.m4a

音声の間にスペースが空いていることに気づきました音声間のスペース

おそらく誰かがこれらのスペースを削除して、各エントリを連結する方法を知っているでしょう

答え1

ffmpeg が AAC ストリームをロードすると、パディング用に 2 フレームの無音部分が内部的に追加されます。これは「プライミング サンプル」と呼ばれることもあります。上記のコメントで、インポイントを 0.2322 に追加すると書かれていますが、これは特定のサンプル レートでは正しいのですが、完全にシームレスにしたい場合は、さらに作業が必要です。

隙間なくシームレスに連結するには、次の操作を実行します。

  1. サンプル レートに基づいて AAC フレームの長さを計算します。たとえば、44.1KHz の場合、1024/44100 = 0.02321995 となります。
  2. 各セグメントの最初と最後に追加の 2 つの AAC フレームをエンコードします。
  3. ffmpeg が常に内部的に追加する 2 つのサイレント パディング フレームを考慮します。
  4. 出力ファイルの作成時に「適切な」コンテンツのみが使用されるように、concat txt ファイルにインポイントおよびアウトポイント ディレクティブを割り当てます。

先頭の 2 つの追加フレームが必要なのは、各 AAC フレームが最大 2 つの前のフレームに依存しているためです。したがって、最初のフレームを正しくエンコードするには、そのコンテキストが必要です。末尾の 2 つの追加フレームが必要なのは、ffmpeg が突然のポップ音を避けるために末尾のオーディオをテーパーするためです。2 つの追加フレームを追加することで、テーパーをシフトし、実際のコンテンツに影響を与えないようにします。これらの追加フレームは、コンテンツの重複を避けるために、インポイントとアウトポイントで削除されます。

この方法を使用する場合、すべてのセグメントの長さが AAC フレーム継続時間の正確な倍数であることが重要です。そうでない場合、セグメントの境界に予期しないアーティファクトが発生します。

最近、実際のコードでこれをさらに実証するリポジトリをリリースしました。https://github.com/wistia/seamless-aac-split-and-stitch-demo

関連情報