#filter #directshow #decoder
#Фильтр #directshow #декодер
Вопрос:
Благодаря ответу Романа R на мой предыдущий вопрос, теперь у меня есть асинхронный фильтр, обертывающий стороннюю библиотеку декодера.
Закодированные входные выборки поступают из сетевого источника. В настоящее время я не добавляю временные метки к декодированным кадрам, поэтому частота кадров довольно резкая, поскольку она зависит от времени получения пакетов данных.
Когда библиотека декодирует полный кадр, она также предоставляет временную метку UTC времени, когда кадр был захвачен в соответствии с часами на исходном кодировщике.
Вопрос в том, как я могу связать это со временем потока и создать разумное значение для функции setTime? Я поиграл с этим, но какие бы значения я ни вводил, кажется, просто блокирует график фильтра в функции CBaseOutputPin::Deliver .
Ответ №1:
Самая простая временная отметка заключается в следующем. Вы помечаете свой первый образец мультимедиа нулем (см. Примечание к корректировке в следующем абзаце), а следующий будет помечен с отличием от него. То есть вы начинаете потоковую передачу и получаете первый сэмпл из своего сетевого источника, запоминаете это время UTC0
и добавляете ноль к сэмплу DirectShow media. Следующие кадры 1, 2 … N со временем UTC UTC1
… UTCN
и будет преобразован в DirectShow time UTCN
— UTC0
. Возможно, вам потребуется дополнительное преобразование в правильные единицы измерения, так как DirectShow потребуется 100 нс, а ваш сетевой источник может выдавать вам что-то вроде 1/90000 с.
Поскольку ваш источник, возможно, является текущим источником, и ваш первый кадр может быть получен не совсем во время выполнения графика, вы можете корректировать временную метку результирующей выборки мультимедиа, используя разницу между текущим графиком фильтра IReferenceClock::GetTime
и временем, полученным в качестве аргумента для IBaseFilter::Run
вызова.
Комментарии:
1. Спасибо. Я пробовал что-то в этом роде, но я использовал текущее значение IReferenceClock::getTime без вычитания времени в IBaseFilter::Run . Я предполагаю, что это привело к блокировке моего фильтра, поскольку значение, возвращаемое getTime, вероятно, является системным временем, а не временем фильтрации.. это правильно?
2. Да, это значение не выровнено по нулю, поэтому вы, вероятно, запланировали воспроизведение своих данных после длительной задержки.
3. Спасибо. Я попробую еще раз утром.