Конвейер содержимого 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, поэтому он, вероятно, точный