XNA переменная скорость звука - PullRequest
2 голосов
/ 12 ноября 2010

Я пытаюсь синхронизировать внешний аудиофайл с видео, которое воспроизводится с переменной частотой кадров.Когда видео воспроизводится медленно, звук должен замедляться, а при ускорении он должен ускоряться.

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

Я точно знаю, какой видеокадр воспроизводится в любой момент, поэтому я надеялся как-то использовать эту информацию для изменения скорости звука.Но, все еще озадаченный тем, как это сделать.

Не имеет значения, искажается ли звук в моем случае, нужно просто постоянно синхронизировать его с видео.Скорость воспроизведения видео контролируется пользователем в реальном времени и не может быть определена заранее.

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

ПРИМЕЧАНИЕ: Я предполагаю, что вы используете Visual Studio 2008/2010, но ответ должен применяться, если вы также используете XNA Game Studio.

Вы можете использовать библиотеку FMOD для воспроизведения звука, она будет делать именно то, что вам нужно.

Начальная настройка
Вы бы загрузить Windows 32-битный API. Оттуда, после того, как вы его установили, вы должны перейти к « C: \ Program Files (x86) \ FMOD Sound System \ API для программистов FMOD Win32 \ API », скопировать fmodex.dll и fmodexL. dll в каталог вашего проекта вместе с содержимым папки Csharp.

Из вашего проекта добавьте 2 DLL-файла и 4 файла классов в ваш проект, щелкнув его правой кнопкой мыши в обозревателе решений и выбрав " Добавить> Существующий элемент ... "; как только они будут добавлены в ваш проект, выберите эти файлы в обозревателе решений и убедитесь, что их свойство «Копировать в выходной каталог» имеет значение «Копировать всегда». Теперь вы готовы использовать систему FMOD.

Использование FMOD
Внутри вашего основного класса добавьте следующий оператор using using FMOD; и добавьте следующие переменные:

private FMOD.System sndSystem;<br> private FMOD.Channel sndChannel = new FMOD.Channel();<br> private FMOD.Sound sndSound = new FMOD.Sound();

Внутри вашего LoadContent ()

FMOD.Factory.Create_System(ref sndSystem);<br> sndSystem.Init(1, INITFLAGS.NORMAL, (IntPtr)null);<br> sndSystem.CreateSound("**<Path To Your Audio>**", MODE.HARDWARE, ref sndSound);

Теперь, где бы вы ни захотели начать играть свой звук, вы просто вставили:

sndSystem.PlaySound(CHANNELINDEX.FREE, sndSound, false, ref sndChannel);

и остановить его:

sndChannel.stop();

Для ваших целей, пока звук воспроизводился вместе с видео, вы определяете, насколько быстро видео идет в этот момент (1,0f для нормальной скорости, 2,0f для двойной скорости, .5f для половинной скорости и т. Д. ) и передайте это значение в sndSound.setMusicSpeed(<speedvalue>);.

0 голосов
/ 11 марта 2011

Путь к успеху по вашему запросу потенциально долгий и трудный.Кажется, что можно делать то, что вы просите, но поскольку свойство PlayPosition класса MediaPlayer доступно только для чтения, это довольно сложно.Вот ссылка, которая может помочь вдохновить вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...