2013-07-18 3 views
2

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

Заранее благодарен!

ответ

2

XNA содержит встроенный в методах, чтобы справиться с этим (нет необходимости всех codework в ответе Пата!)

 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" может относительный или абсолютный путь.

+0

Это СОВЕРШЕННО! Большое спасибо! – BalinKingOfMoria

0

Вы можете попробовать передать его в/из массива байтов (как описано в MSDN Streaming Data from a WAV File).

В принципе, используйте 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, так что, вероятно, точного

+0

Спасибо! Однако TitleContainer.OpenStream требует относительного URI, но я хочу, чтобы иметь возможность воспроизводить песню из любого места на компьютере. Если это невозможно с DynamicSoundEffect, то где именно XNA ищет файл? – BalinKingOfMoria

 Смежные вопросы

  • Нет связанных вопросов^_^