AACエンコーダディレイとx264guiExでの対処方法について

音ズレについて再調査したので、いい機会なのでまとめてみた。

AACエンコーダは一般に2つのフレームで完全な音を出すデータを保持するため、最初の音声フレームからは完全な音を出すことができず、この問題を解消するため、最初に無音のフレームを挿入する。この無音区間で生じる遅延がencoder delayで、そのままでは映像との同期がずれる(音ずれ)原因となりうる。このAACのencoder delayについてはこちらが非常に詳しい。

x264guiExではL-SMASH muxerにお世話になり、その機能を活用するなどして、このディレイカットにx264guiEx 2.05から対応している。

結論から言うと、現在のx264guiExでデフォルトの「AAC (ffmpeg)」エンコーダを使用して出力した場合、edit listの情報によるディレイカットがなされるため、encoder delayは補正され、(encoder delayが原因で)音ずれすることはない。



多くの方はAACエンコーダのディレイについてはご存じと思うが、このあたりのx264guiExでの対応方法をまとめたものがなかったと思うので、今回まとめてみた。

AACエンコーダの遅延は、エンコーダごとに遅延量は決まっており、下記sample数となっている。(HE-AAC*は元の周波数での値)

AAC-LCHE-AACHE-AACv2
ffmpeg1024
qaac21125184
nero262446725616
fdkaac204850567104


例えば、ffmpeg AACの無音区間は1024sampleなので、音声のサンプリングレートは48kHzの場合21.3ms、44.1kHzの場合23.2msの遅延が生じる。

これに対して、x264guiExではx264guiEx 2.05以降、音ずれを打ち消す方法を2パターン用意している。



(1). edit listを用いる方法
mp4/m4aコンテナのedit list情報を使用して、encoder delayをdemuxer/デコーダに伝え、demux/デコード時に補正させる方法。

edit listが存在するかどうかはmp4box -info "mp4ファイル" で確認できる。例えば、ffmpeg AACの出力をみるとこんな感じ。

Track # 2 Info - TrackID 2 - TimeScale 44100
Media Duration 00:00:03.023 - Indicated Duration 00:00:03.023
Track has 1 edit lists: track duration is 00:00:03.000 <<<< これ

edit listの効果は、下記のように見ることができる。

一番上: オリジナル
真ん中: ffmpegのAACエンコーダでedit listの情報を持たせない場合
一番下: ffmpegのAACエンコーダでedit listの情報を持たせた場合

x264guiEx_audio_encoder_delay_webp.jpg

edit listの情報を持たせ、(demux/デコード時に)それを反映することで、ffmpegのAACエンコーダで発生する遅延(1024sample = 23.2ms@44.1kHz)を除去できていることがわかる。

ただし、この方法をうまく活用するには、再生時・デコード時にedit listの情報を反映してくれるdemuxer/デコーダが必要になる。ffmpegとそれを使用するソフトウェア(lwinput.aui)などは問題なくedit listの情報を反映してくれる。

一方、使っている人がいるかはわからないが"MP4 File Reader"などはedit listの情報を反映してくれないみたいなので、できればlwinput.auiを使用したほうがよいと思う。

(1)-1 x264guiExのディレイカット「補正なし」 (=デフォルト)
デフォルトの「補正なし」でも一部の音声エンコーダについては、remuxerでmuxすることで、各音声エンコーダが出力するm4aに含まれるedit listをそのまま活用することができるようにしている。

ディレイカット「補正なし」で音声エンコーダの出力するedit listの活用が可能なのは下記のエンコーダ。
エンコーダ
x264guiEx 3.06以降AAC (ffmpeg)
fdk-aac (ffmpeg)
x264guiEx 3.14以降qaac
fdkaac


これ以外のAACエンコーダ、例えばneroaacencについては、edit listの情報込みのm4aを出力できず「補正なし」では遅延が生じるため、encoder delay対策のためには次の「(1)-2 : edts」を使用する必要がある。

(1)-2 x264guiExのディレイカット「edts」
(1)-1の方法のとれないneroaacencなどの音声エンコーダを用いる場合の方法。L-SMASH muxerのencoder-delayオプションで指定したedit listにより対応する。

このときの音声エンコーダごとの無音区間のsample数は、x264guiEx.iniのmode_x_delayに記載されているものを使用している。



(2). 映像・音声の長さを調整して無理やり同期する方法
edit listを使わず、無理やり同期させる方法のため、特に問題なければ(1)の方法をとるべきと思う。

(2)-1 x264guiExのディレイカット「音声カット」 :
遅延するsample数分、音声の前方をカットして帳尻あわせをする方法。すぐに音声が始まっている動画には不向きだと思う。

(2)-2 x264guiExのディレイカット「映像追加」
遅延するsample数を見越して、先頭に映像・音声フレームを追加して帳尻あわせをする方法。映像・音声の動機は取れるが元動画より映像・音声ともに遅れが生じ、動画時間が延びる。



参考資料



EncoderDelay
Audio Priming - Handling Encoder Delay in AAC



終わりに



AACエンコーダの遅延と、x264guiExでの対処方法についてまとめた。

もし間違ってる点等あればご指摘ください。
スポンサーサイト



コメントの投稿

非公開コメント

No title

と言うことは、x264guiExのバージョンが3.14以降であれば、AAC(ffmpeg)・fdk-aac(ffmpeg)・qaac・fdkaacを使用したエンコードの場合、ディレイカット「edts」していなくても音ズレ対策は自動で行われるという認識でよろしいのでしょうか?また、NVEncやQSVなど他のエンコード方法でも、外部エンコーダーを使用するにチェックを入れ、ディレイカットの部分をedtsに設定したら音ズレは発生しないのでしょうか?

Re: No title

> AAC(ffmpeg)・fdk-aac(ffmpeg)・qaac・fdkaacを使用したエンコードの場合、ディレイカット「edts」していなくても音ズレ対策は自動で行われる

おっしゃるとおりです。

NVEnc/QSVEnc/VCEEncの現時点(9/21)での最新バージョンであれば、外部エンコーダのAAC(ffmpeg)・fdk-aac(ffmpeg)・qaac・fdkaacに加え、内蔵エンコーダについても、ディレイカット「edts」していなくても音ズレ対策は自動で行われます。
プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clfilters 
- OpenCLベースの複数のGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

rkmppenc
- Rockchip系SoCのhwエンコーダ

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR