2016-08-15 3 views
0

Я декодирую с помощью FFMpeg. Видео, которое я декодирую, это видео H.264 или MPEG4 с использованием кода C. Я использую 32-битные библиотеки. Я успешно декодировал и извлек метаданные для первого кадра. Теперь я хотел бы декодировать последний кадр. У меня определенная продолжительность видео, и я считаю, что было безопасным предположением сказать, что 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

Спасибо всем за вашу помощь, но я обнаружил, что причина, по которой продолжительность AV_SEEK_FRAME не работает потому, что вы должны умножить ее на 1000 для того, чтобы применяться в считывающей рамке. Также обратите внимание, что причина, по которой у меня есть, но 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

Смежные вопросы