動画ファイルを不要な末尾のカットをしていて、再エンコードなしでカットすると、キーフレーム単位のような単位で切れるので、最初はこういうものだとあきらめていました。
そもそも動画ファイルがいい加減で、ffmpegもそこまで厳密に扱っていないだろうと。
そんな思い込みが強く、細かくソースを確認することもせず使っていたのですが、最近、とあるPCでカットをすると見事にフレーム単位で切れるんです。もうほんとフレーム単位でスパスパと。
とはいえ、コーディックやフォーマットも特にこれと言って変わったことをしているというのはなし。
今までもキーフレームは意識していましたが、正直思い通りの場所でスパッと切れることは無いのでそういうものだと本とあきらめていた部分だったりします。そんな諦めがとあるPCで作成した動画はフレーム単位でスパっと切れてくれるのに気づき、geminiさんに相談しながら話を掘り下げていくと、ffprobeでフレーム情報を可視化しましょう。と提案され動画ファイルを見てみることに。
最初はキーフレームだけの確認だったのですが、キーフレームは指定通り作成されていました。 キーフレームに絞らずにとりあえずザーッとみてみることにしたんです。
と、その他のフレームもそれなりに作られてて特に問題なさそう…とみているとなんか順序が逆転しているフレームがいくつかあることに気づきました。以下はffprobeの出力の一部
18.833000,___
18.900000,___
19.067000,___
19.000000,___
18.967000,___
19.033000,___
19.200000,___
19.133000,___
19.100000,___
19.167000,___
19.333000,___
19.267000,___
19.233000,___
19.300000,___
19.467000,___
19.400000,___
実際、このファイルは大体4フレーム単位でカットされるものなのですが、これもキーフレームというわけでもないので、良く分からなかったのです。しかもカットするとカットする前後からのフレームの明るさが変わるとか良く分からない状態で理解できず…
しかしこの出力を見てかなり納得しました。エンコード/デコードを行わないというのが前提にあるので、実際にどのようにカットされているのかは不明ですが、2つの考え方があると思います。
一つ目は、順序で参照し、指定された時間を超えたら、ファイルの先頭からそのフレームの一つ前までを出力。
もう一つは、逆順で参照し、指定した時間以内になったら、ファイルの先頭からそのフレームをまでを出力。
そもそも、ファイルに格納される順序が時間順に並んでいないのが問題ではあるものの、実際に出来上がるものは、前者の考え方だと、指定時間までのデータで欠落するフレームがありえるし、後者の考え方だと指定時間と指定範囲外のフレームのデータが含まれるようになります。
なので、動画ストリームの時間と実際の時間のずれが生じる形になるわけです。個人的にはなぜ動画を扱うと誤差が出るのかが非常に疑問だったポイントです。(動画と音声のストリームでのずれはそもそも周期が違っているのでズレが生じるのは当たり前だと理解していましたが、動画ストリームだけで矛盾をはらんでいるのは意識していませんでした。(音声もフォーマットによっては入れ替えが発生するものもあるかもしれませんが。))
で、物理的な違いが分かったところで、geminiさんに相談していくと、いままではコーディックによる違いを臭わせながら回答していたのですが、ここでようやくBフレームの存在を意識して指摘するようになりました。
そもそもBフレームってなに? ってことで、geminiさんがまとめてくれました。
- Iフレーム(キーフレーム): 単体で表示可能。
- Pフレーム: 前のフレームとの差分。
- Bフレーム: 前後のフレームを参照して表示される。
ふむふむ。なるほど、どれも聞いた事があるけどIフレームってキーフレームの事だったのかとか、改めて知りました。
で節々で出てきたGOPと言う物…聞いた事はあるけど良く分からんかったんだよなぁ。と思っていましたが、このI/P/BフレームがまとまったものがGOPと呼んでいるということ。そもそもGroup Of Pictureということ。正式な読み方はわかりませんが、このGOPっていうのがようやく実感できました。
で、今まで意識してなかったBフレームの指定…確かに今、確認できるPCのものは3になってました…。
geminiさんによると、このBフレームの指定を0にする(後のフレームとの差分を取らない)と圧縮率がわずかに下がるものの動画編集は圧倒的に楽になる(思い通りに作業できる)と訴えていました。
とりあえず今は、そこまで厳密にカットする必要がないので設定を変えずに…と思っています。
0 件のコメント:
コメントを投稿