Как стать автором
Обновить

Комментарии 4

Обычно берут единицу времени, используемую для меток времени кодируемого кадра. Если этого не сделать, то видеокодеры обычно выдают ошибку, аудиокодеры устанавливают значение по умолчанию — обратное к частоте дискретизации.
Дело в том, что некоторые видеокодеры используют поле time_base как frame rate, некоторые делают «правильно» и берут само поле frame_rate и используют частоту кадров и частоту дискретизации времени независимо. Проблемы будут если вы нарветесь на первый вариант, например MPEG1/2 Encoder.
Может ли кодек изменить заданную единицу времени, не вполне ясно.
Вполне может, почему нет.
В процессе кодирования необходимо установить pts и dts пакета.
Тут не так все просто, на самом деле. Я считаю что dts это вообще ошибка проектирования и результат инерции мышления. В любом случае мне не известны кодеки которые бы использовали dts. Лично у меня dts сразу сбрасывается и проставляется потом, если необходима запись в контейнер. Такой подход более универсальный и удобный, на мой взгляд. Например, если мы сливаем потоки из нескольких источников в один стрим.
Для меня метки времени одна из самых таинственных частей ffmpeg. То, что я написал базируется на экспериментах, в сомнительных случаях я просто тупо вывожу метки в лог.
Ну тут можно придерживаться примерно следующей логики:

PTS и DTS присутствуют в пакетах и фреймах, почти всегда только для удобства транзита через некоторый воображаемый пайплайн: контейнер -> декодер -> енкодер -> контейнер. Естественно любые стадии могут отсутствовать.
Для непосредственно процесса декодирования метки не нужны, ни PTS ни DTS. Декодер не имеет такого понятия как время, а ориентируется только на порядок семлов — temporal reference. Метки, если есть, просто проталкиваются дальше, на случай если они вдруг понадобятся плееру или енкодеру. Енкодеру DTS не нужны, так как он сам их проставляет исходя из приходящих PTS, а вот PTS могут понадобится. Как минимум, при кодировании видео в некоторые форматы необходимо выдерживать framerate или bitrate, которые высчитываются по приходящим PTS.
DTS нужны только при записи в некоторые форматы контейнеров (типа: MOV, MP4), но точного ответа зачем, из исходников, мне пока найти не удалось, причем ffmpeg муксер ревностно следит за тем что бы DTS <= PTS.
Да, например в контейнер MP4, в таблицу времен семплов записывается DTS. В случае если фреймы идут строго монотонно-возрастающем, по времени (I, P), то DTS совпадают с PTS. В случае если времена идут не монотонно-возрастающе (B), то добавляется еще одна корректирующая таблица, в которую записыватся разница между PTS и DTS. Но на самом деле, на практике, DTS без проблем высчитывается по PTS. У муксера даже есть дополнительный флаг на этот случай.
В большинстве других контейнеров DTS не нужны. В DirectShow, например, который вы упомянули, понятие DTS, вообще отсутствует и это не создает никаких проблем.
Большое спасибо! О чем то я догадывался, но Вы сделали всю картину более ясной.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории