†PCうそつき講座†

MP4動画の音ズレ

作成開始日 2015.03.18
最終更新日 2015.03.18

症 状 ネットで入手したmp4動画の映像と音がずれる。 ズレの大きさは一定ではなく、再生が進むとともにズレが増大する。 冒頭ではほぼ一致しているが、20分近辺では1秒以上のタイムラグとなる。 なお、同様な症状はAvidemuxでmpegを編集した場合も起きる。
原 因 不明。 ただし、変換時の丸め誤差の累積の可能性が高いと思われる。 仮に、0.1%の誤差が20分間累積されると、1.2秒のズレになる。
対 処 一定量のズレならば補正するツールは沢山あるが、 累積的で順次増大するズレを一発で補正するものはない −−少なくと私はも知らない。 そこで、以下のような面倒な手続きで補正することになる。
@動画ファイルから映像と音声を別々に取り出す。
A両者の長さを比較し、音声の再生速度を映像に合わせて調整する。
B両者を1本のファイルに再結合する。
ツール ffmpeg 汎用動画変換ツール(フリー)/ Audacity サウンド編集ツール(フリー)

●補正の具体例

@inp.mp4から映像と音声を別々に取り出す

入手した動画ファイルをinp.mp4とすると、 以下の要領で映像v.mp4と音声a.aacに分離できる。

ffmpeg -i inp.mp4 -vcodec copy -an v.mp4
ffmpeg -i inp.mp4 -acodec copy a.aac
なお、変換が終了すると、ファイルの長さ(時間)が表示されるので、 必ずメモしておくこと。 たとえば、今回入手したファイルの長さは次のようであった。
V: 26:32.38 (1592.38")
A: 26:35.21 (1595.21")
このように、約3秒のズレが発生しているのが判る。

A両者のファイルの長さを確定する

上記の手順でファイルの長さは一応判るわけだが、 念のため、次のようにしてファイルの長さを確認する。

ffmpeg -i v.mp4
ffmepg -i a.aac
これで上記の長さと同じ値が表示されれば何の問題もないが、 必ずしも同じ値になるとは限らない。 と言うのは、音ズレが発生している段階で、 そのファイルはブロークンであると考えるべきであり、 各種の情報が正しく処理されていない可能性も十分にありうるからだ。

  今回の例では、ffmpeg -i a.aacで長さを確認すると28:52.93となり、 映像と2分半もズレていることになってしまう。これは明らかに誤情報である。 しかも、プレイヤーで再生すると、26分30秒くらいで勝手に終了してしまう。

そこで、実際の視聴でズレの大きさの大体の目安を付けて、 それが表示される長さの差と一致するかどうか、必ず確認すること。 もし、大きな違いがあるようなら、いろいろなプレイヤーや編集ツールで読み込んでみて、それらしい値になるものを見つけること。

B誤差率を算出する

たとえば、上記の例では;

VとAの誤差(A)1595.21"-(V)1592.38" = 2.83"
Aを基準とした誤差率2.83"/1595.21" = 0.001774 (0.1774%)

となる。したがって、音声の再生速度を0.1774%速くすれば良い。

C音声の速度を変更する

この作業にはAudacityを使用する。 このツールの優れている点は、速度が0.0001%単位で変更できること。 今回の用途には必須の機能である(他のツールは1%単位のことが多い)。

Audacityをダウンロード⇒インストール⇒起動したあと [編集|設定|ライブラリ]でffmpegライブラリをダウンロードして、 DLLの場所を手動で認識させる(自動認識をしていても)。 この作業をしないと、mp4関連のファイルは扱えない。 その上で、

  1. [ファイル|開く]でa.aacを開く。
  2. Ctrl-Aで全選択をする。
  3. [エフェクト|スピードの変更]で速度変更ダイアログを開く。
  4. ここで0.1774を指定して、[OK]をクリックする。
  5. 変換が終了すると、ウィンドウ最下行に変換後の長さが表示されるので確認する(*)。
  6. 長さを確認したら[ファイル|オーディオの書き出し]を選ぶ。
  7. 出力フォーマットとしてm4a(aac)を選んでa.m4aファイルを出力する。
(*)変換後の長さは映像ファイルの長さと完全に一致しなくてもよい。0.2〜0.3秒くらいの差ならさほど気にならない。

これで、速度が補正された音声ファイルが出来上がる。 なお、この方法ではaacのビットレートは192kbpsになる(変更方法不明)。 必要があればffmpegなどで適宜変更する。

D音声と映像を再結合する

ffmpeg -i v.mp4 -i a.m4a -vcodec copy -acodec copy out.mp4
とすれば、両者が結合されて音ズレのないファイルout.mp4が作成される。


【PCうそつき講座目次】 【ホーム】