Не удалось сгенерировать правильный файл WAV из необработанного потока

Я захватил поток необработанных аудиоданных вместе с его структурой WAVEFORMATEXTENSIBLE. WAVEFORMATEXTENSIBLE показан на рисунке ниже:

WAVEFORMATEXTENSIBLE структура

Следуя стандарту файла WAV, я попытался записать сырые биты в файл WAV. Что я делаю, это:

  1. напиши "RIFF".

  2. написать DWORD. (filesize - sizeof ("RIFF") - sizeof (DWORD)).

=== WaveFormat Chunk ===

  1. написать "WAVEfmt "

  2. написать DWORD. (размер структуры WAVEFORMATEXTENSIBLE)

  3. написать WAVEFORMATEXTENSIBLE структуру.

=== Факт Чанк ===

  1. напиши "факт"

  2. написать DWORD. ( 4)

  3. написать DWORD. (количество выборок в потоке, которое должно быть sizeof (rawdata) * 8 / wBitsPerSample).

=== Блок данных ===

  1. написать "данные"

  2. написать DWORD (размер rawdata)

  3. написать необработанные данные.

После получения файла WAV из описанных выше шагов, я проиграл файл WAV с помощью медиаплеера, звука нет, игра с дерзостью выдаст мне искаженный звук, я слышу, что это правильный звук, который я хочу, но звук искажен шумом.

Исходные данные можно найти здесь

WAV-файл, который я генерирую, находится здесь

Меня это очень смущает, потому что когда я использую тот же метод для преобразования данных IEEE-float в файл wav, он работает просто отлично.

2 ответа

Решение

Я понял это, кажется, цикл освобождения буфера getbuffer в IAudioRenderClient помещает необработанные данные в том же формате, что и в метод инициализации IAudioClient.

GetMixFormat в IAudioClient в моем случае отличается от формата, переданного в метод инициализации. Я думаю, что GetMixFormat получает формат, который поддерживает устройство.

IAudioClient должен был выполнить преобразование формата из инициализированного формата в mixformat. Я перехватываю метод инициализации, получаю формат, и он работает как шарм.

Я перехватываю WASAPI для доступа к аудиоданным и сталкиваюсь с той же проблемой, когда сгенерированный аудиофайл из данных звучит как правильный контент, но почему-то очень шумно, хотя частота кадров, ширина выборки, количество каналов и т. Д. Установлены правильно .

Поле SubFormat WAVEFORMATEXTENSIBLE показывает, что данные на самом деле являются KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, тогда как я изначально рассматривал их как целые числа. Согласно этой странице , KSDATAFORMAT_SUBTYPE_IEEE_FLOAT эквивалентен WAVE_FORMAT_IEEE_FLOAT в WAVEFORMATEX. Следовательно, установка «аудиоформата» в fmt-фрагменте wav-файла (обычно начинается с 20-й позиции) на WAVE_FORMAT_IEEE_FLOAT(что равно 3) решила проблему. Не забудьте указать это с прямым порядком байтов.

  • Исходное значение аудиоформата
  • После модификации
Другие вопросы по тегам