Flashの音ずれまとめ
2009.05.13 08:58
先日Twitterで盛り上がりを見せていた、Flashの音ずれに関するまとめです。意外と詳しいまとめって無いんですね。
論より証拠ということで実証サンプルを作ってみました。後半で一時停止して再開するとそのずれを体感できます。音源つきでソース(ver8)もついてるのでFla編集中にとれだけずれているかも確認できます。わずか10分で音源を用意してくれたよこしまさんに多大なる感謝です。
この問題についてまとめ・対処法の紹介をしていきます。
そもそもどんな問題かというと、Flashで「ストリーミング」に設定した音声でも、編集中とswfでは音声がずれるという問題です。まずは基本的なまとめ
- バージョンやフレームレートに関係なく、ずれは生じます
- ずれ方は開始点がずれるのではなく「徐々に」ずれていきます
- swfの仕様なので改善される可能性は皆無
さらに経験則も含めた詳しいまとめ
- swfにすることによって音声(mp3)が改変されることは無い(圧縮されるだけ)
- ずれているのはFla編集中のプレビューおよびswfを一時停止したときの「頭出し」
- 動画に変換した場合もswf再生と同じタイミングになる
- ずれ方は、Fla編集中に徐々に音声が前倒しになってくる
- よってFla編集中にぴったりあわせているとswfにしたときに絵が徐々に速くなってしまう
- ずれ幅はfpsによらず、大体700~750フレームにつき1フレーム
- 音質64kbps以下はさらに別な要因もあるかも
長いFlashになればなるほどそのずれは広がっていきます。たとえば3000フレームの場合約4フレームほどずれてしまうわけで、結構ばかになりません。
対処法として私がとっているのが、Fla編集の最後に750フレーム間隔くらいで全レイヤーに対して1フレームを挿入していく方法です。グラフィックシンボルのループが切れてしまったりしないよう細心の注意が必要ですが。
音声が改変されることは無いので、MGのような正確な同期が必要となる場合、BPMを測ってタイミングの目安を作っておくと制作の目印にもなりますし、修正作業もしやすいです。 お勧めなのが一拍=一回転の時計を作っておく方法。メトロノームの役割になるわけですが、これだと裏拍や三連符もばっちりつかめます。
だんだん話がずれてきちゃいますが、 時計の作り方について。例えば60fpsでbpm148の場合1分=60*60=3600フレームで148回転。これを約分の要領で900フレームで37回転・・といった具合に計算します。Flashのトゥイーン設定は100回転以上に設定するとおかしくなるバグがあるので注意です。
若干別の話になりますが、音質を64kbps以下にするとbpm計算した「正しい」タイミング(サンプルで言う赤い方)もずれていきます。サンプルで音質を変えてパブリッシュすれば確認できるかと思います。
追加情報お待ちしております。

音ズレってここまで発生するのか・・・。
この記事見て初めて知りました。
ところで、音ゲーとかでたまに環境ズレとかありますけど
これってこれと関係あったりするんでしょうかね・・・?
音ゲーというとFlashのでしょうか。
ストリーミングだと思います。
ただ、この問題は環境には寄らないはずです。
Flashはブラウザによって処理落ちの挙動も変わるので
それが関係してるのかもしれません。
ストリーミングですか・・・。
そういえば、このFlashは後々進んでから一時停止>再生するときにストリーミング再生されるまでにわずかな空白があるけど、これってストリーミング再生>そのフレームまで一気に進む>同期って流れになるのかな。もしそうだとするとこの問題と関係しそうな気がする。
BGM付きのファイルがどうしてもうまく動かなくて青くなっていた所でしたが、こちらの記事のおかげで無事に解決致しました。
ありがとうございます。