Надежно получить значения PTS в ffmpeg?

Я пытаюсь написать метод, который будет предоставлять следующий кадр и отметку времени презентации при запросе. В настоящее время код выглядит примерно так:

while( getNextFrame(image, pts) )
{
    // show current image
    drawImage(currentImage);
    sleep(pts);
    currentImage = image;
}

До сих пор я следил за учебными пособиями Dranger, но застопорился на надежном получении значения PTS для кадров (http://www.dranger.com/ffmpeg/tutorial05.html). Возвращаемые значения PTS всегда равны 0.

Кроме того, get_buffer() устарел, поэтому теперь я использую метод get_buffer2() для установки глобального значения pts. Однако метод release_buffer также устарел, и я не могу найти ему замену. Это наводит меня на мысль, что метод, изложенный в учебниках, больше не может быть лучшим способом выполнения этой задачи.

Короче говоря, используя обновленный ffmpeg, как лучше всего надежно получить значения точек кадра?


person karl_    schedule 20.11.2013    source источник
comment
Существует версия этого руководства с обновленным исходным кодом.   -  person llogan    schedule 21.11.2013


Ответы (1)


Хорошо, вы не предоставляете много информации, поэтому я собираюсь сделать некоторые предположения о вашем коде.

int err, got_frame;
AVFormatContext *avctx;
AVPacket avpkt;
AVFrame *frame;
// You open file, initialize structures here
// You read packet here using av_read_frame()
{
    AVStream *stream = avctx->streams[avpkt.stream_index];
    if ( 0 > ( err = avcodec_decode_video2 ( stream->codec, frame, &got_frame, &avpkt ) && got_frame ) )
    {
        int64_t pts = av_frame_get_best_effort_timestamp ( frame );
        // TODO test for AV_NOPTS_VALUE
        pts = av_rescale_q ( pts,  stream->time_base, AV_TIME_BASE_Q );
        // pts is now in microseconds.
    }
}
person szatmary    schedule 20.11.2013
comment
av_frame_get_best_effort_timestamp - это именно то, что я искал. Спасибо! - person karl_; 21.11.2013
comment
av_frame_get_best_effort_timestamp() теперь устарела. Какая замена? - person Blake Senftner; 01.05.2020
comment
Замена заключается в прямом доступе к полю AVFrame-›best_effort_timestamp. - person Blake Senftner; 01.05.2020