Синхронизация анимации со звуком

После того как вы загрузили и воспроизвели звук, пришло время синхронизировать его с анимацией. Т. к. анимация проигрывается в соответствии со временем (миллисекундами в данном случае), вы можете получить с помощью DirectSound точное время проигрываемого звука. Используя это значение времени, вы можете обновлять синхронизированную анимацию губ каждый кадр, делая ее таким образом великолепно синхронизированной со звуком.

Замечание. Автоматические особенности, такие какморгание глазмеша, должны выполняться в соответствии с внешним счетчиком, а не временем проигрывания DirectSound. Для получения значения внешнего счетчика (в миллисекундах) вы можете использовать функцию timeGetTime, которая возвращает значение DWORD, содержащее количество миллисекунд, прошедшихсмоментазапуска Windows.

Для получения времени проигрываемого звука используйте интерфейс IMediaPosition, созданный в предыдущем разделе. Функция, которую мы ищем, называется IMediaPosition::get_CurrentPosition и имеет только один параметр-указатель на REFTIME (вещественный тип данных), как вы можете видеть здесь:

REFTIME SndTime; // REFTIME = float pPosition->get_CurrentPosition(&SndTime);

Для получения текущего времени воспроизведения просто умножьте значение REFTIME, полученное с помощью get_CurrentPosition на 1000.0 и преобразуйте результирующее число в переменную DWORD. Это преобразованное значение будет содержать время, используемое для обновления синхронизированной лицевой анимации губ. Следующий кусочек кода демонстрирует преобразования времени, полученного с помощью get_CurrentPosition в миллисекунды.

DWORD MillisecondTime = (DWORD)(SndTime * 1000.0f);

Вы используете значение времени (MillisecondTime) для нахождения соответствующей последовательности лицевых мешей фонем, которые применяются для морфирования данных анимации, загруженной с помощью анализатора .X файлов. Немного позднее вы увидите демонстрационные программы этой главы, в которых показано, как использовать эти значения времени в анимациях. (Смотрите конец главы для получения дополнительной информации о демонстрационной программе.)

Если вы забежали вперед и пробовали воспроизвести синхронизированные звук и анимацию, вы могли заметить, что что-то не так. В реальном мире, прежде чем произнести звук, человек двигает ртом. В текущем состоянии метод син хронизации не учитывает этот фактор. Однако не волнуйтесь, вам просто необходимо немного сместить время анимации для решения этой проблемы. Просто вычтите небольшое количества времени из анимации, я предлагаю от 30 до 80 миллисекунд, но вы можете попробовать варьировать это значение для повышения точности синхронизации.

Использование DirectShow для звука || Оглавление || Зацикливание воспроизведения звуков