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()