Как создать метки времени в моем фильтре декодера? - PullRequest
0 голосов
/ 25 октября 2011

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

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

Когда библиотека декодирует полный кадр, она также предоставляет временную метку UTC времени, когда кадр был захвачен в соответствии с часами на исходном кодере.

Вопрос: как я могу связать это со временем потока и создать разумное значение для функции SetTime? Я поиграл с этим, но все значения, которые я ввел, похоже, блокируют график фильтра в функции CBaseOutputPin :: Deliver.

1 Ответ

0 голосов
/ 25 октября 2011

Самая простая отметка времени заключается в следующем.Вы ставите отметку времени в первом образце мультимедиа с нуля (см. Примечание о корректировке в следующем параграфе), и последующие отметки будут помечены как разница.То есть вы начинаете потоковую передачу и получаете первый семпл из сетевого источника, запоминаете это время UTC0 и присоединяете ноль к семпловому образцу DirectShow.Следующие кадры 1, 2 ... N с временем UTC UTC1 ... UTCN будут преобразованы в время DirectShow UTCN - UTC0.Вам может потребоваться дополнительное преобразование в нужные единицы, поскольку DirectShow потребуется 100 нс единиц, а ваш сетевой источник может дать вам что-то вроде 1/90000 с.

Поскольку ваш источник, возможно, является живым источником, а ваш первыйкадр может быть получен не точно во время выполнения графика, возможно, вы корректируете временную метку выборки носителя, используя разницу между IReferenceClock::GetTime текущего графа фильтра и временем, полученным в качестве аргумента для вызова IBaseFilter::Run.

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