†PCうそつき講座†
作成開始日 2015.03.18
最終更新日 2015.03.18
症 状 | ネットで入手したmp4動画の映像と音がずれる。 ズレの大きさは一定ではなく、再生が進むとともにズレが増大する。 冒頭ではほぼ一致しているが、20分近辺では1秒以上のタイムラグとなる。 なお、同様な症状はAvidemuxでmpegを編集した場合も起きる。 |
原 因 | 不明。 ただし、変換時の丸め誤差の累積の可能性が高いと思われる。 仮に、0.1%の誤差が20分間累積されると、1.2秒のズレになる。 |
対 処 | 一定量のズレならば補正するツールは沢山あるが、
累積的で順次増大するズレを一発で補正するものはない
−−少なくと私はも知らない。
そこで、以下のような面倒な手続きで補正することになる。 @動画ファイルから映像と音声を別々に取り出す。 A両者の長さを比較し、音声の再生速度を映像に合わせて調整する。 B両者を1本のファイルに再結合する。 |
ツール | ffmpeg 汎用動画変換ツール(フリー)/ Audacity サウンド編集ツール(フリー) |
入手した動画ファイルを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関連のファイルは扱えない。 その上で、
これで、速度が補正された音声ファイルが出来上がる。 なお、この方法ではaacのビットレートは192kbpsになる(変更方法不明)。 必要があればffmpegなどで適宜変更する。
D音声と映像を再結合する
ffmpeg -i v.mp4 -i a.m4a -vcodec copy -acodec copy out.mp4とすれば、両者が結合されて音ズレのないファイルout.mp4が作成される。