Конвейер содержимого XNA Загрузка WAV-файлов во время выполнения

Я пытаюсь загрузить песню во время выполнения, используя XNA Game Studio. Тем не менее, он не в формате.xnb, если он не был в папке Content Project, когда программа была впервые скомпилирована. Поскольку я хочу извлечь файл из любого места на компьютере и загрузить его с помощью конвейера содержимого, я не знаю, что делать, за исключением того, что пользователь помещает свою песню в папку Content Project перед тем, как запускать программу. Однако мне было интересно, есть ли лучший, более удобный способ сделать это. Кроме того, они не смогут ничего поместить в папку Content Project, когда будет выпущено приложение, так как будет выпущен только файл.exe, а не собственно решение VS2012. Есть ли способ загрузки файлов во время выполнения, когда они не находятся в папке Content Project?

Заранее спасибо!

2 ответа

Решение

XNA содержит встроенные методы для этого (нет необходимости во всей кодовой обработке в ответе Пэт!)

        System.IO.FileStream fs = new System.IO.FileStream(@"C:\Myfile.wav", System.IO.FileMode.Open);
        SoundEffect mysound = SoundEffect.FromStream(fs);
        fs.Dispose();

@"C:\Myfile.wav" может быть относительным или абсолютным путем.

Вы можете попробовать передать его в / из байтового массива (как описано в разделе " Потоковые данные MSDN из файла WAV").

В основном, используйте TitleContainer.OpenStream(@"soundfile.wav") в вашем LoadContent() функция для создания System.IO.Stream объект. Тогда к BinaryReader с new BinaryReader(wavStream),

Прочитайте заголовок:

int chunkID = reader.ReadInt32();
int fileSize = reader.ReadInt32();
int riffType = reader.ReadInt32();
int fmtID = reader.ReadInt32();
int fmtSize = reader.ReadInt32();
int fmtCode = reader.ReadInt16();
int channels = reader.ReadInt16();
int sampleRate = reader.ReadInt32();
int fmtAvgBPS = reader.ReadInt32();
int fmtBlockAlign = reader.ReadInt16();
int bitDepth = reader.ReadInt16();

if (fmtSize == 18)
{
    // Read any extra values
    int fmtExtraSize = reader.ReadInt16();
    reader.ReadBytes(fmtExtraSize);
}

int dataID = reader.ReadInt32();
int dataSize = reader.ReadInt32();

Прочитайте фактические данные звука:

byteArray = reader.ReadBytes(dataSize);

Затем целый набор сложного кода для настройки DynamicSoundEffect объект (подробно по ссылке выше)

Тогда вы можете просто использовать dynamicSound.Play() а также dynamicSound.Stop() играть и остановить свой звук!

Отказ от ответственности: я не тестировал этот метод воспроизведения звуков, но он из MSDN, поэтому он, вероятно, точный

Другие вопросы по тегам