2016年1月7日木曜日

Flash flvplayback 思った位置にシークできない場合のエンコード設定

Flashで動画再生する機会は減ってきていますが・・・以下TIPS。

Flashでflvplaybackコンポーネントを使用して動画を再生し、指定の位置にシークしようとしたとき、うまくシークできないことがあります。
具体的は、13秒へシークするように指定しているのに、10秒の位置に飛んでしまう、といった現象。
この現象について、動画のエンコードの問題の可能性があります。

基本的に、動画ファイルについて「キーフレーム」を設定した位置にしかシークできません。
「基本的に」と書いたのは、最近のブラウザに実装された動画プレイヤーだとこの問題は起きないようにプレイヤーが仕様を吸収しています。「動画の技術仕様の基本」という意味では、そのとおりで、flvplaybackはこれに忠実に動作します。

つまり、キーフレームが5秒ごと 0秒、5秒、10秒、15秒 の位置に設定されていると、13秒の位置にシークしたいのに、10秒あるいは15秒などずれた位置に飛ぶことになります。

以下、TMPGEncによるエンコード設定方法

この動画は、12fpsです。

これがTMPGEncのデフォルト設定。

GOPの標準フレーム数が「250」となっています。
これは、実際は動画の内容によって最適化されますが、画面に動きがなければ、最大250フレームごとにキーフレームを打つということになります。つまり、最大で20秒ちょっとの間隔があきます。

改善設定例
標準フレーム数を12にしました。フレームレートと同じなので、最大でも1秒間隔でキーフレームが入ります。

これだけ見ると、「標準フレーム数を小さくしておけばいいじゃん」と思いますが・・・
データ量が圧倒的にふえるため、同じビットレートだと、格段に画質落ちます。
動画の内容によりますが、ビットレートを2倍(つまりデータ容量もほぼ2倍)にしても、まだ元の設定のほうが画質がいい、というくらい変わります。

よって、データ容量とのバランスで調整する必要があり。


最後に、私もこの設定「GOP」について完全には理解していないが、なんとなく、こういうこと
http://www.xucker.jpn.org/keyword/gop.html