Не удалось сгенерировать правильный файл WAV из необработанного потока
Я захватил поток необработанных аудиоданных вместе с его структурой WAVEFORMATEXTENSIBLE. WAVEFORMATEXTENSIBLE показан на рисунке ниже:
Следуя стандарту файла WAV, я попытался записать сырые биты в файл WAV. Что я делаю, это:
напиши "RIFF".
написать DWORD. (filesize - sizeof ("RIFF") - sizeof (DWORD)).
=== WaveFormat Chunk ===
написать "WAVEfmt "
написать DWORD. (размер структуры WAVEFORMATEXTENSIBLE)
написать WAVEFORMATEXTENSIBLE структуру.
=== Факт Чанк ===
напиши "факт"
написать DWORD. ( 4)
написать DWORD. (количество выборок в потоке, которое должно быть sizeof (rawdata) * 8 / wBitsPerSample).
=== Блок данных ===
написать "данные"
написать DWORD (размер rawdata)
написать необработанные данные.
После получения файла 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) решила проблему. Не забудьте указать это с прямым порядком байтов.