Pergunta

Eu tenho um # aplicação c que reproduz arquivos WAV simples através do DirectSound. Com os dados de teste que eu tinha, o código funcionou bem. No entanto, quando eu usei dados do mundo real, ele produziu um erro muito inútil na criação do buffer secundário: "ArgumentException:. O valor não recai no intervalo esperado"

Os wavs teste tinha uma 512kbps mordeu taxa, 16bit tamanho da amostra de áudio e taxa de amostragem de áudio 32kHz. Os novos wavs é 1152kbps, 24bit e 48 kHz respectivamente. Como posso me DirectSound para lidar com esses valores maiores, ou se não como posso programaticamente detectar esses valores antes de tentar reproduzir o arquivo?

É gerido DirectX v9.00.1126 que estou usando, e eu incluí um código de exemplo a seguir:

using DS = Microsoft.DirectX.DirectSound;  
...  
DS.Device device = new DS.Device();
device.SetCooperativeLevel(this, CooperativeLevel.Normal);  
...
BufferDescription bufferDesc = new BufferDescription();
bufferDesc.ControlEffects = false;  
...
try
{
    SecondaryBuffer sound = new SecondaryBuffer(path, bufferDesc, device);
    sound.Play(0, BufferPlayFlags.Default);
}
...

Informações adicionais:. Os arquivos WAV do mundo real não vai jogar no Windows Media Player seja, contando-me um codec é necessário para reproduzir o arquivo, enquanto eles jogam muito bem em winamp

Informações adicionais 2: Comparando os bytes de dados de teste de trabalho e os dados do mundo real ruins, eu posso ver que além do pedaço RIFF, os dados ruim tem um "bext" pedaço, que os informa internet me é metadados associados com a extensão de transmissão de áudio, enquanto os dados de teste vai direto para um pedaço fmt. Há / é / um pedaço fmt nos dados ruins, então eu não sei se ele está mal-formado ou se os carregadores deve estar olhando mais para os dados FMT. Eu posso ver se eu posso obter alguma informação sobre este rouge bext pedaço das pessoas que fornecem me os dados -. Se eles podem removê-lo meu código ainda pode funcionar

Foi útil?

Solução

Nem todas as placas de som suportar a reprodução de amostra de 24 bits, e mesmo quando o fazem, eles muitas vezes têm de ser exclusivamente aberto nesse modo. Há um problema semelhante com taxas de amostragem. Sua placa de som pode estar operando em 44,1, em que as necessidades caso 48kHz a ser redefinidos para ser jogado.

Eu escrevi uma biblioteca .NET áudio de código aberto chamado NAudio que permitirá que você a descobrir o que taxa de amostragem e profundidade de bits de um determinado arquivo WAV é. Ele também oferece formas alternativas de reprodução de áudio de volta (por exemplo através do Wav ... APIs), e a capacidade de arquivos resample usando o objeto DMO resampler.

Outras dicas

Além do problema de amostragem, WAV é apenas um formato contêiner eo áudio pode ser comprimido em qualquer um de uma miríade de formatos de áudio (assim como AVI é um container de vídeo). Então, você poderia usar uma ferramenta como GSpot para descobrir se o seu WAV é codificada em um formato não-padrão e instalar o codec. Winamp tem mais codecs instalados por padrão de WMP, o que explicaria o Winamp toca e WMP não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top