2005年11月11日

音ズレの許容範囲

【概 要】A/V Syncの許容範囲はどの程度か
【タ グ】[A/V Sync]


結論。映像1フレーム以下。24fpsの場合、目標は 0.024秒。

*留意点:
以下は妖精現実さん2005/11/09の記事「LAME tagと動画の音ずれ」からの抜粋です。
原文には、これはまだ「意見」であり、議論の叩き台にしたいとの断り書きがあります。
が、
今の自分の目標はMac OSXでx264+aac.mp4を作成した場合に発生する音ズレの解決。人間の許容範囲はどの程度なのか?を知る事にあります。
したがって、
このエントリにおける引用はそこに関連する部分に限っており、結果として原文の論旨はぐちゃぐちゃになっています。
MP3や-tスイッチでぐぐって来た方に有益な情報は無いと思います。ごめんなさい。
いつも以上に、人の話を聞きながら書いたメモ、レベルですからね。

なお、通常このブログでは妖精現実さんにはリンクを貼らず、全文コピペしています。
先方のサイト案内の内容と、日常的な記事から伺える主張(全面的には賛同しかねるがココロ惹かれるものがある事)、想定される読み手さんの違い、などか ら、
そうすべきだ、と考えています。


AVIの音声部分をMP3にする場合など、lameを普通に使うと、映像/字幕に対して音声が約50ms遅れ、音声 の末尾は削られてしまう。
原因は「LAMEタグ」であり、動画用のMP3作成では-tスイッチを使ってこれを無効化するべきだ。

はい。50msは問題だと。0.050(秒)ずれたらいかんというわけですね。
MP3は基本的にWAVの1152サンプルずつを1グループとして処理するので、WAVに比べて時間の解像度が1000倍以上も悪い。
毎秒48000サンプルでは、オーディオの1フレームが24msとなる。

1/48000×1152 = 0.024(秒)

WAV自身は、1/48000秒すなわち約0.02msの解像度があるのだから、24ms単位の入れ物では正確な長さが再現できない。

オーディオにもフレームがあるわけだ。
映像1フレームの持続時間(映像の1コマは24fpsで約0.042秒)と音声1フレームの持続時間(AACでどうなのかは不明)が異なるから、基本的に ズレは生じるものである、と。
で、目下自分の関心は、aac音声とx264映像の全長が異なる事にある。自己ベストは約0.09秒差。audio_delayを弄るなり映像のフレーム を手動で抜 くといった手間はできれば、避けたい(そしてQuickTimeには可能な限り、依存したく ない)。
映像と音声の再生時間の差をどこまで詰めればいいのか?
LAMEタグが解釈されないと、確実に映 像の1フレーム以上、音ずれする。特にデリケートなタイミングを行って いるカラオケなどでは深刻であり、
一般にも、 爆発音や全力疾走する人の足音など、鋭い立ち上がりエッジの音は、映像との1フレームの非同期が問題となりうる。
1フレームずれたらダメか。やっぱ早口でしゃべってる人間とか厳しいよなぁ。
(LAMEタグを禁止する事で)24msオーダーの不正確さは残 る。

この問題は、対 音声の字幕同期においてカラオケでは問題になりうるが、
より一般的な対 映像の音声同期については、典型的なビデオ(24/25/30fps)では1フレームが33〜42msのオーダーだから、
24msの 粒度は一応十分である。24ms単位の途中で起きること、つまり10msオーダーにこだわるなら、
人間の耳とスピーカーが数メートル離れているだけでも同じオーダーの影響がある(音速は約340メートル/秒だから)。
したがって、ス ピーカーとの距離まで指定するのでない限り、10msのオーダーにこだわる意味はほとんどない
映像1フレームの半分程度。目標は0.024秒か。

、、、ん?でもxvid+mp3.aviでは[A-V] 0.03程度はいっつもずれてたような?
もしかして、audio delayの調整って必須の作業?

まとめ

  1. 映像1フレームの半分程度。24fpsなら目標は0.024秒。
  2. audio delayの調整は必須の作業かもしれない。
posted by ばる at 01:43| Comment(11) | TrackBack(0) | その他 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
QuickTime Playerの「選択範囲に調整して追加」を使っても、
フレームのズレ(微細な時間差)は直りませんね。
1フレームずつ削って合わせたりしてます。

ソースファイルの状態からズレていないかも気になるところです。
そういうチェックってどうやっていますか?

直接QuickTime Playerの新規ムービー録画(新規オーディオ録音)
で取り込んだソースを使って試せれば良いんですが・・・。
録画に使える装置を持ってないんです。
DVカメラでもあれば良いんですけどね。
Posted by ナル at 2005年11月11日 16:55
素材はCaptyTVの録画のみです。MPEG2-PS(音声MP2)ってヤツ。
映像と音声が統合されちゃってるんで個別の全長はでないっぽいです。
そのままMEncoderでxvid+mp3.aviにしてたんで、今まで音ズレって気にした事なかったんですよ。
M2Vとaiffに分離するとそこで全長がずれる事があるらしいですけども。

MP4作成では、
MEncoderで映像エンコ、ffmpegで音声エンコ、mp4boxでmux(ffmpegXと一緒)
するようになって、始めて音ズレとゆうものに巡り会ったとこです^^;
問題が2個。
1)QTで再生はできるが加工できない。再変換になる←後回し
2)地味に映像と音声の全長が違う。0.15〜0.25sec程度。←目下の課題
 どこまで追い込めばいいのか目安が欲しかったというのがこの記事です。

あとは、
$ mp4box -info XXX.mp4
のほうがQTより細かい数字が出る臭いですよ。
Posted by ばる at 2005年11月12日 00:22
音声と映像の再生時間にわずかな違いがあるのは、フレームのサイズに違いによるもので、音ズレとは全く別の問題です。
また、音声と映像の同期というのは、音声を映像に合わせる事でも、映像を音声に合わせる事でもなく、音声と映像を、それぞれ正しい時間軸に合わせる事で実現するべきです。
再生時間を合わせるために映像のフレームレートを計算で調整したり、音声の長さを縮めたりするのは愚の骨頂です。
Posted by at 2005年11月12日 01:04
理論じゃなくて経験則なんで、そのつもりで。

M2V,MP2,AC3などの個々のエレメンタリーストリーム(ES)は絶対的なタイムコードを持ってません。VOBやMPGなどのPSコンテナがタイムコードを持っててそれぞれのESをそのタイムコードに当てはめているようです。

ただ、経験上音声の「速さ」が変わることは無くても、映像の「速さ」はdemuxやエンコードで結構変化するようです。

なので、コンテナに格納されている状態での映像・音声、そしてコンテナから取り出された音声は適切な「速さ」で再生されます。

よって、mencoder等につっこむときの映像素材は、あとでdemuxする意図があるにしても必ずコンテナに入れられた状態のものを使用するべきであり、決してm2vをmencoderに流し込んではいけないと言うことです。音声同期で泣きを見ることになります。

あと、demuxした音声ファイルですが、コンテナのタイムコードの00:00;00から始まっているとは限らないです。数フレームずれた状態で音声トラックが開始されている可能性があります。これが「選択範囲を調整して追加」で泣きを見る原因です。

ただ前述のとおり音声の長さは変わらないので、mencoder等でエンコードする際は音声トラックも一応一緒にmuxした状態で書き出すのが理想的です。あとは書き出されたデータをもとに音声トラックの初期位置をQuickTimeと耳を使って手動検出してmuxすればいいです。
Posted by Yoshiki@その蜩blog at 2005年11月12日 11:32
補足です。

前述のようにmencoderからコンテナに入った状態をソースとして音声と同期を取るように書き出された映像データは、たとえdemuxしても基本的に想定された時間軸どおりになるはずです。

というのは、音声は初期位置が違う以外絶対的タイムコードを保持するため、音声に同期することで映像も絶対的タイムコードに準拠することになり、aviコンテナは絶対的タイムコードを持っていないためdemuxしてもその効果は消えない、ということです。

自分の経験の範囲内では、基本的に以上のことが成り立ちます。ただ問題は、mencoderが映像と音声の同期を取る際のフレームスキップが稚拙なことでしょう。ときどき「おやっ?」と思うほどスキップしたりしますので…。
Posted by Yoshiki@その蜩blog at 2005年11月12日 11:40
補足その2です、すいません。

ただ、ぱるさんのソースはDVDでなくCaptyTVなのでそんなに音声トラック開始位置とか悩むような癖のあるコンテナには出会わないとは思いますが…こればっかりは門外漢なのでなんとも言いようが無いです。
Posted by Yoshiki@その蜩blog at 2005年11月12日 11:44
ぱるさん、無名のかた、Yoshiki@その蜩blogさん、レスをありがとうございます。
QuickTime Playerで長さを変えて貼り付けるのは良くない事でした。
強引な方法とはわかっていましたが、けっこうやっていた事なんで自分の中では悪いことという感覚がなくなっていました。

CaptyTVのデータもDVDのデータにしても、PSコンテナの状態では映像と音声は00:00;00に合わせて始まっているということで良いのでしょうか?
(実際に音声が鳴るのが00:00;00でなくても、データとしてはシンクロしている?)
それがmencoderやffmpegでLAMEを使ってAVIファイルを作るとズレが発生してしまうと…。
MP4作成のほう(変換君の作者さんのffmpeg使用とmencoder+ffmpeg+mp4box使用)でも音ズレが発生していたんで、PSコンテナを使っていてもズレるものかな〜って思いました。
Posted by ナル at 2005年11月12日 21:27
■蜩さん。
毎度お世話になっております。
勿体ないので自分なりにまとめてエントリー化させていただきたいのですがいいですか?

>ぱるさんのソースはDVDでなくCaptyTVなのでそんなに音声トラック開始位置とか悩むような癖のあるコンテナには出会わないとは思いますが…

そーなんす。TVキャプチャでおかしいですよね。
ケアレスミスかもしれないのでもういくつかAVI経由でやってみましょう。
HDもそろそろ厳しいですし。つうかヤバい。

■ナルさん
PSコンテナでは
・映像の長さ
・音声の長さ
は隠蔽されてるって事だと思います。
それらとは別に
・PSコンテナの長さ
だけ表示されてるって事かと。

ずれる原因1)
PSコンテナには
・音声だけ00:00;03から始めれ!
とか書き込んである事もある。こういうのは映/音分離すっとずれた映/音が出来る。Captyではちと考えにくい事ですが。まさか、やってねーだろーな?^^;

ずれる原因2)
映像と音声は本来別のメトロノームを持っててそれに合わせて踊るもの。
指揮者(PSコンテナ)がいると踊り中に細かい指示飛ばすけど、いないと踊りが合わないよ(メトロノームには合ってるけど)と。ってなんの実用性もねーなこれ。
映像のメトロノームはfps,音声のメトロノームは不明(毎秒48000サンプルでの、AACオーディオの1フレームの秒数)。

あ、あとlameに関してはこのエントリは参考にしないで下さいね。
このエントリのテーマは「人間の視聴覚の許容範囲」ですから。為念。
Posted by ばる at 2005年11月13日 01:38
映像と音声のメトロノームというのは、きっとMP4Boxなどで表示されるタイムスケールのことだと思います。私はよくわかりませんが。

何故映像と音がずれるのかというと、個人的な解釈では映像のFPSが29.97と割り切れない値なのに対して、音声が一秒何々サンプルと決まっている点にあると思います。この映像のfpsは、den/num、具体的には30000/1001と計算します。よって、映像データコンテナに書き込む時には、1001/30000を書き込みますって感じで処理します。きっとこのような処理を行っている限り、映像と音がずれてしまうのかなと思います。

Handbrake(多分ffmpegなどでも)では、もっと難しいことをしていて、きちんと独自にタイムスケールに対してどのポジションにあるのかを計算してデータを書き込んでいるようです。ここまでやってもずれてしまうのは、やっぱり割り切れないからか。

まあよくわかりませんが、0.3秒程度のずれなら人間にはあんまり違和感が無いような気がします。時々ひどいDVDは明らかに映像と音がシンクロしていないのがありますしね。ただ、再生後に画面が白くなってしまうのはまずいですよね。ちなみにmp3やmp2音声は1152サンプルが1まとまりなのに対して、aacは1024サンプルずつエンコードします。

最近のffmpegやmencoderなどでは、Quicktimeで再生できるmpeg4って簡単に作成できるようになったのでしょうか?
Posted by esperance at 2005年11月13日 10:29
>>ナルさん
そんなに悪いことでもないと思います。要するに、人間の知覚範囲できれいに収まってしまえばいいわけですから。

>>ばるさん
私がここに書いた情報はどのように使用されてもかまいませんよ(w

「VOB,MPG,MP4コンテナが絶対的タイムコードを持っていて、AVIが持っていない」ということは、30/24fps混在ソースでの作業においてその影響が顕著に見られることになります。

DVDのVOBなどで30fpsテレシネと24fpsプログレ混在というのはしばしば見られるのですが、VOBの中ではm2v映像をタイムコードに配置してさらにfps情報を与えることで適切に再生します。ためしにdemuxしてみると、m2vはfps情報を持たないため30fpsとしてすべてを再生するようになってしまいます。

mencoderで音声と同期を取らずにこの手のソースを変換したら最後、あとから同期をとるのはほぼ不可能です。AVIが絶対的タイムコードを持っていないからです。音声とあわせてやることでなんとか同期が取れますが。。。Windowsの世界の方々は、ここで120fps化を持ち出してくるわけです。

ここまでくると論理的に考えてもあやふやになってしまうので、この辺でやめときます。まあ結局のところ、タイムコードが生かせるかが同期がとれるかの決め手になってくるような気がします。その点がmencoderのアキレス腱でしょう。ただ、VFRをまともに扱えるエンコーダといえばMacではQTPlayerとmpeg2decXくらいのものですが。。。
Posted by Yoshiki@その蜩blog at 2005年11月13日 11:43
■esperanceさん
お久しぶりです!

>>個人的な解釈では映像のFPSが29.97と割り切れない値なのに対して、音声が一秒何々サンプルと決まっている点にあると思います。

自分もそう推定して、絵の悪影響はともかく、映像24.000fps,音声48000Hzでやってみました。結果、映像と音声の再生時間差は0.09秒台。じゃ映像48000fpsも試したるか!ってところで音声にもフレームってのがあったなと。

>>aacは1024サンプルずつエンコード
有り難うございます。

>>0.3秒程度のずれなら人間にはあんまり違和感が無いような
知覚自体は可能なように思います。
 ・自分のPDAのストップウォッチは、桁数が0.00secまである。
 ・100ms(0.1sec):字幕のズレが誰が見ても分かるレベル。(妖精現実)
 ・100〜200ms(0.1〜0.2sec):聴覚のみ。母音の種類による認識の時間差。再生音を聞くときだけ発生。http://mito.cool.ne.jp/stutstudent/curio.html
 ・30ms(0.03sec):視覚と触覚の時差。http://www.moriyama.com/netscience/Shimojo_Makoto/Shimojo-3.html
 ・ゲーマーの中にフレーム単位でコマンドを語る人がいる。〜3フレーム以内にABABとか。ゲーセンのモニタなら毎秒60フレーム(1フレーム=0.01666667sec)になります。

自分の録画傾向で問題になりそうなのは古めのミュージカル映画でしょうか。こないだ「スウィングガールズ」取り損ねたけど。早口のしゃべりや音楽関係も「ん?」ってとこができるんではないかと。
再生時間の全長に差があっても、同期がとれてれば問題ないと思いますが。

>>画面が白くなってしまう
 bframes=1を疑ってます。
 vfw/aviでBを使う為のdelay frameなるハッキング
 (アタマに3フレームのダミーを入れ、尻の3フレームが消失)が残るのじゃないかと。
 B使うとQTで再生できるが加工できない、とか、映音の再生時間差は0.09秒台=23.976fpsで2〜3フレーム

>>最近のffmpegやmencoderなどでは、Quicktimeで再生できるmpeg4って簡単に作成できるようになったのでしょうか?

上記の点を気にしなければ、はい。
自分の感性で気になる事は、自分の録画傾向(映画とアニメ)では、マレです。
Bを一切使わなければさらに、はい。
こまかく実験してませんが、白フレームが入らず、QTでの加工も可能でした。
DVDは不明です。その蜩さんのレスをご参考下さい。
Posted by ばる at 2005年11月13日 19:48
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。