Почему некоторые wav-файлы воспроизводятся в моем приложении c # directsound, а некоторые нет? - PullRequest
3 голосов
/ 19 сентября 2008

У меня есть приложение на c #, которое воспроизводит простые wav-файлы через directsound. С тестовыми данными, которые у меня были, код работал нормально. Однако, когда я использовал реальные данные, при создании вторичного буфера возникла очень бесполезная ошибка: «ArgumentException: значение не попадает в ожидаемый диапазон».

Тестовые файлы имели скорость передачи 512 кбит / с, размер аудиосэмпла 16 бит и частоту дискретизации 32 кГц. Новые wavs - 1152 кбит / с, 24 бит и 48 кГц соответственно. Как я могу получить DirectSound, чтобы справиться с этими большими значениями, или, если нет, как я могу программно определить эти значения, прежде чем пытаться воспроизвести файл?

это управляемый DirectX v9.00.1126, который я использую, и я включил несколько примеров кода ниже:

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);
}
...

Дополнительная информация: реальные wav-файлы также не воспроизводятся в Windows Media Player, сообщая, что для воспроизведения файла необходим кодек, в то время как они хорошо воспроизводятся в winamp.

Дополнительная информация 2: Сравнивая байты рабочих тестовых данных и плохих реальных данных, я вижу, что после фрагмента RIFF у плохих данных есть блок "bext", о котором интернет сообщает мне, что это метаданные с расширением широковещательного звука, в то время как тестовые данные поступают прямо в блок fmt. В плохих данных есть / is / fmt-чанк, поэтому я не знаю, плохо ли он сформирован или загрузчики должны искать fmt-данные дальше. Я могу посмотреть, смогу ли я получить некоторую информацию об этом бэк-бэк-баге от людей, предоставляющих мне данные - если они смогут удалить их, мой код все еще может работать.

Ответы [ 2 ]

6 голосов
/ 19 сентября 2008

Не все звуковые карты поддерживают воспроизведение 24-битных сэмплов, и даже когда они это делают, их часто приходится открывать исключительно в этом режиме. Существует аналогичная проблема с частотой дискретизации. Ваша звуковая карта может работать на частоте 44,1 кГц, и в этом случае необходимо воспроизвести частоту 48 кГц для воспроизведения.

Я написал аудио-библиотеку .NET с открытым исходным кодом, которая называется NAudio , которая позволит вам определить частоту дискретизации и битовую глубину данного файла WAV. Он также предлагает альтернативные способы воспроизведения аудио (например, через API Wav ...) и возможность повторной выборки файлов с помощью объекта DMO resampler.

4 голосов
/ 19 сентября 2008

В дополнение к проблеме сэмплирования, WAV является просто контейнерным форматом, и аудио может быть сжато в любом из множества аудиоформатов (точно так же, как AVI является контейнером видео). Таким образом, вы можете использовать такой инструмент, как GSpot , чтобы узнать, закодирован ли ваш WAV в нестандартном формате, и установить кодек. В Winamp по умолчанию установлено больше кодеков, чем в WMP, что объясняет, что Winamp воспроизводит его, а WMP - нет.

...