DirectShow push источники, синхронизация и отметка времени - PullRequest
1 голос
/ 06 ноября 2011

У меня есть график фильтра, который принимает необработанные аудио- и видеовходы, а затем использует ASF Writer для их кодирования в файл WMV.

Я написал два пользовательских push-фильтра, чтобы обеспечить ввод данных дляграф.Аудиофильтр просто использует WASAPI в режиме обратной петли для захвата звука и отправки данных в нисходящем направлении.Видеофильтр принимает необработанные кадры RGB и отправляет их в нисходящем направлении.

Как для аудио, так и для видеокадров у меня есть значение счетчика производительности на время захвата кадров.

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

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

Например, предположим, что видеофильтру в идеале нужно работать со скоростью 25 кадров в секунду, но из-за задержки и т. Д.включен, кадр 1 начинается с отметки 1/25, но кадр 2 начинается позже ожидаемой отметки 2/25.Это означает, что теперь на графике есть промежуток, поскольку время окончания кадра 1 не соответствует времени начала кадра 2.

Вопрос 2: Будут ли нижестоящие фильтры знать, что делатьс задержкой между кадрами 1 и 2, или мне нужно вручную уменьшать длину кадра 2?

1 Ответ

1 голос
/ 06 ноября 2011
  1. Один из вариантов - опустить метки времени, но это может привести к тому, что фильтры не смогут обработать эти данные. Другой вариант - использовать System Reference Clock для создания меток времени - в любом случае это предпочтительнее прямого использования счетчика производительности в качестве источника меток времени.
    1. Да, необходимо синхронизировать видео и аудио, чтобы синхронизировать их, это единственный способ сказать, что данные фактически относятся к одному и тому же времени
    2. Сэмплы видео не имеют времени, вы можете опустить время остановки или установить его равным времени начала, разрыв между временем остановки видеокадра и временем начала следующего кадра не имеет значения
  2. Рендереры могут свободно выбирать, следует ли им соблюдать метки времени или нет, со звуком вам, конечно, понадобится плавный поток без пропусков в метках времени
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...