ffmpeg c / c ++ получить количество кадров или отметку времени и кадров в секунду - PullRequest
7 голосов
/ 26 января 2012

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

Что мне нужно: фпс видеофайла, метка временитекущий кадр или кадр нет (не рассчитано)

Что у меня есть: я могу получить время видео, используя

pFormatCtx->duration/AV_TIME_BASE

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

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

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

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

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

1 Ответ

6 голосов
/ 26 января 2012

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

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

Допустим, у нас был фильм, и кадры отображались так: I B B P. Теперь нам нужно знать информацию в P, прежде чем мы сможем отобразить либо B кадр. Из-за этого кадры могут храниться так: 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 нашего недавно декодированного сырья кадр, поэтому мы знаем, когда его отобразить.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...