Я пытаюсь записать анимацию (компьютерную графику, а не видео) в файл WMV с помощью DirectShow.Настройка:
Источник Push, который использует растровое изображение в памяти, содержащее кадр анимации.Каждый раз, когда вызывается FillBuffer (), данные растрового изображения копируются в выборку, а в выборку ставятся временные метки с начальным временем (номер кадра * длина кадра) и длительностью (длина кадра).Частота кадров в фильтре равна 10 кадрам в секунду.
Фильтр модуля записи ASF.У меня есть файл пользовательского профиля, который устанавливает видео на 10 кадров в секунду.Это фильтр только для видео, поэтому нет звука.
Контакты подключаются, и когда график запускается, создается файл wmv.Но ...
Проблема в том, что DirectShow загружает данные из Push-источника со скоростью, превышающей 10 FPS.Таким образом, результирующий wmv, воспроизводимый и содержащий правильную анимацию (а также сообщающий о правильном FPS), воспроизводит анимацию несколько раз слишком медленно, потому что во время записи в видео было добавлено слишком много кадров.То есть 10-секундное видео со скоростью 10 кадров в секунду должно иметь только 100 кадров, но в него вставляется около 500 кадров, в результате чего продолжительность видео составляет 50 секунд.
Моя первая попытка найти решение состояла в том, чтобы простозамедлите вызов FillBuffer (), добавив sleep () на 1/10 секунды.И это действительно работает более или менее.Но это кажется хакерским, и я подвергаю сомнению, хорошо ли это будет работать при более высоких FPS.
Так что мне интересно, есть ли лучший способ сделать это.На самом деле, я предполагаю, что есть лучший способ, и я просто скучаю по нему.Или мне просто нужно придумать способ задержки FillBuffer () в Push-источнике и использовать лучший механизм синхронизации?
Буду признателен за любые предложения!