スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ffmpegによるmp4形式の動画のキーフレームの設定について

今日はキーフレームのお話をしたいと思います。

動画ファイルのデータ表現について
ご存知の方が多いと思いますが、動画ファイルというものはたくさんの静止画を連続で表示することによって表現されています。ぱらぱらマンガのようなものです。
この静止画の集まり、一枚ずつばらばらに保存していると動画ファイルのサイズがとても大きくなってしまいます。
そこで、静止画を何枚かにまとめ、そのまとまりごとに保存することが多いです。これが圧縮という操作です。
動画を扱う際には、この圧縮方法に気を使ってやらなければいけない場合があります。

キーフレームについて
上で述べたように、動画はいくつかのまとまりに分割されて保存されます。
MPEG形式の動画では、このまとまりの最小単位のことをGOP(Group Of Picture)と呼びます。
そして、GOPの一枚目の動画をキーフレーム(またはイントラフレーム、Iフレーム)と呼びます。
詳しくはこちらをさっくり読んでみてください。
ごちゃごちゃ書いてありますが、要はキーフレームがまとまりのインデックスになってると思ってください。

んで、このキーフレーム、動画の再生点を変えるのに使うんです。
例えば、40秒の動画があるとします。
この動画は、キーフレームが5秒ごとに設定されています。
この動画の再生点を18秒にする場合のイメージはこんな感じです。



このように、インデックスであるキーフレームに移動してから再生したい位置に再生ヘッドを移動させていると考えてください。
再生点の移動(シーク)はキーフレームごとにしかできません。

ここで問題が。
例えば、15秒から再生したい!という場合は簡単です。15秒のキーフレームにぽーんとシークしてそのまま再生を始めることができます。
しかし図のように18秒から再生したい場合、15秒にいったんシークして、その後18秒に再生点が到達したら動画を表示します。
つまり、約3秒程度のタイムラグが発生するわけです。
動画にもよりますが、30秒動画の真ん中あたりを再生したいときに5秒も10秒も待たされたらちょっといらいらしますね。
そこで、このキーフレームをたとえば1秒ごとに挿入してあげます。すると、シークが1秒ごとになり、結果としてタイムラグは1秒以下に抑えられます。

ただ、注意しなければならないのは、このキーフレームを増やすと動画のサイズが大きくなってしまうというデメリットがある点です。
自分の再生環境に合わせて折り合いをつけていきましょう。

GOPの設定方法

以前紹介したffmpegにGOPを設定する方法があるようです。
GOPはオプションで設定できます。

ffmpeg -i 変換元のファイル -g GOPの間隔 変換後のファイル


GOPの間隔はフレームレートによってかわります。
例えば、フレームレート30fps(つまり、1秒間に30枚の画像が表示される)の場合、設定するGOPを300とすれば300枚の画像を1つのまとまりとするので、キーフレームは300÷30となり、10秒ごとにキーフレームが挿入されることになります。
また、同じくフレームレート30fpsでGOPを30に設定した場合、画像30枚ごとにキーフレームが挿入されるので、結果として1秒ごとにキーフレームが設定されることになります。

以上、キーフレームについてでした。
ちょっとまだよくわかってない部分も多いので、修正することもあるかもしれません。
ご参考までに。

それでは、今回はこの辺りで。
関連記事

コメント

非公開コメント
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。