Я использую DirectShow для воспроизведения фильмов. Я изменяю видео / аудио данные и визуализирую все сам в своем приложении. Поэтому я использую фильтры SampleGrabber и NULL рендеры.
Проблема возникает, когда я перематываю фильм (используя интерфейс IMediaSeeking) — звук значительно отстает от видео (на несколько секунд).
Я понимаю основы и временные метки синхронизации аудио / видео. Я понимаю, что фильтры рендеринга могут отбрасывать кадры в зависимости от времени представления.
Но я думаю, что фильтры SampleGrabber просто получают все данные? Возможно ли получить аудио / видео данные, уже синхронизированные в моих обратных вызовах SampleCB?
На примере обратного вызова граббера вы получите данные с отметкой времени. Если вы сохраняете метки времени, которые вы получаете, и вы обеспечиваете синхронизацию воспроизведения данных с использованием этих меток времени с точки зрения воспроизведения данных с одинаковыми метками времени во всех потоках в любое время — тогда у вас будет хорошая синхронизация ,
Выборочные грабберы получают все данные, но это не означает, что эти данные достигают грабберов в синхронизированном порядке. Соответствие меткам времени абсолютно необходимо. Поскольку видео может быть сжато во времени, а аудио, как правило, нет, при поиске могут быть получены дополнительные предварительные данные на участке видео, которые могут обрабатываться неправильно.