シークが早いH.264動画のエンコード
プログラムに連動して動画ファイルをシークさせようとした時に、
エンコード設定の違いで動作が劇的にスムーズになったのでメモ。
動画エンコードにはffmpegを使う。Macportsとかでインストールできる。
ffmpegの使い方については以下のサイトが分かりやすかった。
サンプルで使って慣れる。ffmpeg の使い方。 - それマグで!
通常の視聴用にエンコードされたmp4(H264)ファイルはシークできる間隔が数秒単位で開いている事が多い。そのままだと、プログラムからシークできないフレームを呼び出した際にカクつきやすい。
プログラムから動画を細かくシークする場合には( -g 1)オプションを入れる事で全フレームがシーク可能になる。
また、( -tune zerolatency)オプションを追加することで再生の際のレイテンシーを減らす事ができる。ファイルサイズは少し増加するが、頭出しが速くなる。
あとは解像度(-vf scale=横幅ピクセル数:-1)や画質(-crfオプション)を調整してファイルサイズを小さくしたり、必要に応じて音声なし(-an オプション)にしたりするとスムーズに動くようになると思う。
自分の環境だと全フレームシーク可能化(-g 1)と低レイテンシ(-tune zerolatency)の設定の有無で違いが大きかった。
ffmpegは操作がコマンドラインからだったりしてとっつきにくいけども、シンプルに使えて自由度も高いので、今後もお世話になりそう。