Почему некоторые файлы WAV воспроизводятся в моем приложении C# DirectSound, а некоторые нет?

StackOverflow https://stackoverflow.com/questions/100654

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня есть приложение С#, которое воспроизводит простые файлы WAV через DirectSound.С имеющимися у меня тестовыми данными код работал нормально.Однако когда я использовал реальные данные, при создании вторичного буфера возникла очень бесполезная ошибка:«АргументИсключение:Значение не попадает в ожидаемый диапазон».

Тестовые файлы WAV имели скорость передачи данных 512 кбит/с, размер аудиовыборки 16 бит и частоту дискретизации звука 32 кГц.Новый формат WAV составляет 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, что говорит мне о том, что для воспроизведения файла необходим кодек, хотя в Winamp они воспроизводятся нормально.

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top