答え1
ffmpeg が AAC ストリームをロードすると、パディング用に 2 フレームの無音部分が内部的に追加されます。これは「プライミング サンプル」と呼ばれることもあります。上記のコメントで、インポイントを 0.2322 に追加すると書かれていますが、これは特定のサンプル レートでは正しいのですが、完全にシームレスにしたい場合は、さらに作業が必要です。
隙間なくシームレスに連結するには、次の操作を実行します。
- サンプル レートに基づいて AAC フレームの長さを計算します。たとえば、44.1KHz の場合、1024/44100 = 0.02321995 となります。
- 各セグメントの最初と最後に追加の 2 つの AAC フレームをエンコードします。
- ffmpeg が常に内部的に追加する 2 つのサイレント パディング フレームを考慮します。
- 出力ファイルの作成時に「適切な」コンテンツのみが使用されるように、concat txt ファイルにインポイントおよびアウトポイント ディレクティブを割り当てます。
先頭の 2 つの追加フレームが必要なのは、各 AAC フレームが最大 2 つの前のフレームに依存しているためです。したがって、最初のフレームを正しくエンコードするには、そのコンテキストが必要です。末尾の 2 つの追加フレームが必要なのは、ffmpeg が突然のポップ音を避けるために末尾のオーディオをテーパーするためです。2 つの追加フレームを追加することで、テーパーをシフトし、実際のコンテンツに影響を与えないようにします。これらの追加フレームは、コンテンツの重複を避けるために、インポイントとアウトポイントで削除されます。
この方法を使用する場合、すべてのセグメントの長さが AAC フレーム継続時間の正確な倍数であることが重要です。そうでない場合、セグメントの境界に予期しないアーティファクトが発生します。
最近、実際のコードでこれをさらに実証するリポジトリをリリースしました。https://github.com/wistia/seamless-aac-split-and-stitch-demo。