2016-08-15 21 views
0

FFMpegを使用してデコードしています。私がデコードしているビデオは、Cコードを使ったH.264またはMPEG4ビデオです。私は32ビットのlibsを使用しています。私は正常にデコードし、最初のフレームのメタデータを抽出しました。私は今、最後のフレームをデコードしたいと思います。私はビデオの期間を定義しており、それはisLastFrame = durationと言うのは安全な仮定だと感じました。ここに私の持っているものがあります。最後のフレームからFFmpegでデコードしてメタデータを抽出する方法は?

AVFormatContext* pFormatCtx = avformat_alloc_context(); 
avformat_open_input(&pFormatCtx, filename, NULL, NULL); 
int64_t duration = pFormatCtx->duration; 
i=0; 
while(av_read_frame(pFormatCtx, &packet)>=0) { 
    /* Is this a packet from the video stream? */ 
    if(packet.stream_index==videoStream) { 
    /* Decode video frame*/ 
     avcodec_decode_video2(pCodecCtx, pFrame, &duration, &packet); 
    } 

ご協力いただきありがとうございます。 :)

答えて

0

あなたの助けのおかげでみんなが、私はそれが読み取りフレームに適用できるようにするためにあなたが1000年を掛けなければならないので、AV_SEEK_FRAME期間が働いていなかった理由があることがわかりました。また、デコード関数の代わりにdecode_videoを使用している理由は、32ビットを使用していて自分で作成しているためですが、video_decode()をプラグインするかdecode_video2だと信じているので注意してください。うまくいけば、これは将来、どんな仲間のデコーダにも役立つでしょう。

AVFormat Format; 
int64_t duration = Format->duration; 
duration = duration * 1000; 
if (av_seek_frame(Format, Packet->stream_index, duration, AVSEEK_FLAG_ANY) <= 0) 
    { 
     /* read the frame and decode the packet */ 
     if (av_read_frame(FormatContext, &Packet) >= 0) 
     { 
      /*decode the video frame*/ 
      decode_video(CodecContext, Frame, &duration, &Packet); 

     } 
0

これはあなたが探しているものかもしれません:

CODEC_CAP_DELAY機能が設定されているコーデックの入力と出力の間の遅延 を持って、これらはavpkt->データ= NULLを供給する必要があります、 avpkt-> size = 0最後に残りのフレームを返します。

Link to FFmpeg documentation

関連する問題