

ffmpegで動画の静止画を出力するには下記のような方法で出力できますが、

$ ffmpeg -i 元動画.avi -ss 144 -t 148 -r 24 -f image2 %06d.jpg

I,B, Pフレームの生データを出力する方法はないでしょうか？


CC BY-SA 3.0
2017-09-22T02:33:57.923
38100
2017-11-10T08:53:36.400
25507
question
ffmpeg
ffmpegでフレームの生データを出力する方法


`select`フィルタで出力が可能なようです。

>   * Bフレーム  
>  `-vf select=eq(pict_type\,B)`
>   * Pフレーム  
>  `-vf select=eq(pict_type\,P)`
>   * Iフレーム  
>  `-vf select=eq(pict_type\,I)` or `-skip_frame nokey`
>

参考：  
[【ffmpeg】動画から特定フレームを画像で出力する方法 :
ニコニコ動画研究所](http://looooooooop.blog35.fc2.com/blog-entry-1021.html#bpi)


CC BY-SA 3.0
2017-09-22T03:46:14.453
38102
2017-09-22T03:46:14.453
3060
38100
answer


> ビットストリームのことです。元動画のコーデックはmpeg2です。

単純にMPEG-2 Videoビットストリームを抽出するだけであれば、下記コマンドで実現可能です：

[code]

    ffmpeg -i input.ts -c:v copy -f mpeg2video output.mp2v
    
[/code]

**注意：** AVIコンテナはその仕様上、Bフレームを含むMPEG-2 Videoストリームを"正しく"格納できません。"Packed
B-frame"とよばれる回避策も考えられてはいますが、正しく取り扱えるか否かは動画プレイヤー次第です。MPEG-2
Videoを取り扱う場合、AVIコンテナの利用は避けたほうがよいです。

* * *

> I,B, Pフレームの生データを出力する方法はないでしょうか？

おそらく、ツールとしてのFFmpegにそのような機能はありません。

  * （cubickさん回答でも言及されている）Video Filterは、デコード後の映像フレームに対するフィルタ処理になります。
  * ビットストリームを取り扱う BitStream Filter(bsf) という仕組みも存在しますが、所望されるようなフィルタは提供されません。

また、仮に"P/Bフレームのみ"データを取り出せたとしても、そのデータのみでは正しく映像デコードを行えません。MPEG-2デコーダや解析ツールを開発されているなら話は別ですが、そうでなければ、Iフレームを含まないデータには全く使い道がありません。  
なお、"Iフレームのみのデータ"は完結して映像デコード可能なので、ギリギリ意味があるかもしれません。


CC BY-SA 3.0
2017-09-25T09:40:26.463
38175
2017-09-26T05:19:09.330
2017-09-26T05:19:09.330
49
49
38100
answer