ffmpeg c / C++ получить количество кадров или метку времени и fps

Я использую ffmpeg для декодирования видеофайла в C. я изо всех сил пытаюсь получить либо количество текущего кадра, который я декодирую, либо временную метку кадра. Я прочитал множество сообщений, которые показывают, как вычислить оценочный кадр нет на основе fps и временной метки кадра, однако я не могу получить ни один из них.

что мне нужно: fps видеофайла, временная метка текущего кадра или кадра нет (не рассчитывается)

что у меня есть: я могу получить время видео с помощью

pFormatCtx->duration/AV_TIME_BASE

Я считаю кадры в настоящее время, когда я их обрабатываю, и получаю текущее количество кадров, это не будет работать в долгосрочной перспективе. Я могу получить общее количество кадров для файла, используя

pFormatCtx->streams[currentStream->videoStream]->nb_frames

Я читал, это может не работать для всех потоков, хотя он работал для каждого потока я пробовал.

Я попытался использовать time_base.num и time_base.значения и пакет den.pts, но я не могу понять смысл ценностей, которыми я являюсь получая от них, поэтому мне просто нужно лучше понять, что это за ценности.

кто-нибудь знает о ресурсах, которые показывают примеры того, как получить эти значения?

1 ответов


этот url-адрес обсуждает, почему значения pts могут не иметь смысла и как получить разумные: учебник ffmpeg и SDL от Dranger

вот эксперт по этой ссылке, который дает указания о том, что именно вы ищете с точки зрения номеров кадров и временных меток. Если это кажется вам полезным, вы можете прочитать больше документа для более полного понимания:

скажем, у нас был фильм, и кадры были показаны как: I B B P. Теперь нам нужно знать информацию в P, прежде чем мы сможем отобразить либо б каркас. Из-за этого кадры могут храниться следующим образом: I P B B. Вот почему у нас есть временная метка декодирования и презентация время на каждый кадр. Временная метка декодирования говорит нам, когда нам нужно чтобы расшифровать что-то, и штамп времени презентации говорит нам, когда мы нужно что-то показать. Так, в этом случае, наш поток может выглядеть вот так:

PTS:    1 4 2 3
DTS:    1 2 3 4
Stream: I P B B

обычно PTS и DTS будет отличаться только тогда, когда поток мы в игре есть B кадров.

когда мы получаем пакет от av_read_frame(), он будет содержать значения PTS и DTS для информации внутри этого пакет. Но то, что мы действительно хотим, это PTS нашего недавно декодированного raw кадр, чтобы мы знали, когда его показывать.

к счастью, FFMpeg предоставляет нам метку времени "лучшее усилие", которая вы можете получить через, av_frame_get_best_effort_timestamp()