Estou trabalhando em um tipo de aplicativo "Game Maker" para Windows em que o usuário importa seus próprios ativos para serem usados no jogo. Preciso carregar esse conteúdo em tempo de execução no lado do mecanismo.
No entanto, não quero que o usuário precise instalar nada além do tempo de execução do XNA, portanto, a chamada do pipeline de conteúdo no tempo de execução acabou.
Para imagens, estou indo bem usando o Texture2D.FromStream.
Também notei que o XNA 4.0 adicionou um método FromStream à classe SoundEffect, mas ele aceita apenas arquivos wave PCM.
Eu gostaria de suportar mais do que arquivos wave, pelo menos MP3.
Alguma recomendação? Talvez alguma biblioteca C # que decodificasse para o formato de onda PCM.
Respostas:
Eu não tinha notado o método FromStream, é bom lembrar. Agora estou curioso para usar o FromStream vs DynamicSoundEffectInstance, já que você teoricamente poderia realizar muito do mesmo trabalho com os dois métodos.
O Google criou esta biblioteca: http://robburke.net/mle/mp3sharp/ E você também pode chamar lame.exe de dentro do seu aplicativo para decodificar o som.
Eu seria cauteloso com MP3, porém, é uma lata legal de worms. A Adobe paga uma taxa alta à Fraunhofer pelo direito de usá-la no Flash. Ogg Vorbis é um formato superior, facilmente convertido de mp3 usando software livre e de código aberto, e parece haver muito mais bibliotecas de decodificadores C # / .Net para isso.
fonte
Decidi tentar novamente esse problema hoje e finalmente consegui carregar um arquivo OGG em tempo de execução em um
SoundEffect
objeto. Aqui está o que eu fiz! Primeiro baixe a biblioteca abaixo, que contém uma classe capaz de decodificar arquivos OGG:Pré-requisito - Download da biblioteca
A biblioteca já tem um exemplo, mas usa
DynamicSoundEffectInstance
e transmite o áudio. Mas eu queria carregar tudo de uma vez em umSoundEffect
objeto comum, para que o processo fosse um pouco diferente.Etapa 1 - decodificar arquivo
Primeiro crie uma instância
OggDecoder
e inicialize-a com seu arquivo:Etapa 2 - Obter dados decodificados
Leia todos os dados em um buffer. Estes são os dados PCM brutos decodificados do arquivo:
Etapa 3 - Crie o SoundEffect a partir do fluxo que contém o cabeçalho completo do arquivo wave
No entanto, o fluxo que
SoundEffect
requer deve conter não apenas os dados brutos, mas também o cabeçalho completo do arquivo wave. Você pode usar este método auxiliar para escrever o cabeçalho mais os dados:Use esse método para gravar os dados em um fluxo que pode ser alimentado para
SoundEffect.FromStream
:Etapa 4 - Use o SoundEffect normalmente
Seu arquivo OGG agora está carregado e pode ser usado como qualquer outro
SoundEffect
carregado pelo pipeline de conteúdo:fonte
Se você está apenas visando o Windows, descobri que a maneira mais fácil é ignorar completamente a API do XNA Audio e usar outra coisa.
Eu achei a API FMOD excelente para isso, e ela já vem com um wrapper C #. Adicionei meu próprio invólucro ao redor deles e aqui está o mínimo necessário para carregar um som de um arquivo e reproduzi-lo:
O invólucro:
E como usá-lo:
É claro que o invólucro é apenas o mínimo, mas deve ser simples de expandir para expor outros recursos necessários.
fonte