Размер буфера захвата WASAPI

Я использую WASAPI в wp8.Как я использую GetbufferМетод в режиме совместного использования каждый раз, когда он возвращает буферы с разным размером. Я захвата в 8000 Гц /16 бит, а иногда Getbuffer возвращает буфер с 80 выборками, а иногда с 400 выборками и. Это нормальное поведение при отправке различной hnsBufferDuration в IAudioClient::Initialize не влияет на размер буфера?

2 ответа

Да, это нормальное поведение. Я не знаю конкретно о Windows Phone, но, по крайней мере, на рабочем столе Windows, это способ, которым захват общего режима должен работать, поэтому я подозреваю, что он не отличается на wp8. При работе с буферами захвата WASAPI есть 3 вещи, о которых вы должны знать.

  • Общий размер буфера, который указан как hnsBufferDuration в IAudioClient::Initialize. WASAPI создаст буфер запрошенного размера ИЛИ БОЛЬШЕ. Вызовите IAudioClient::GetBufferSize, чтобы получить фактический общий размер буфера.

  • Периодичность (также аргумент для IAudioClient::Initialize). Этот параметр указывает, как часто WASAPI будет обрабатывать буфер, например, вы можете установить буфер 30 мс, который обрабатывается каждые 3 мс WASAPI. Периодичность используется только в эксклюзивном режиме.

  • Размер пакета, это то, с чем вы имеете дело. Что происходит, так это то, что размер внутреннего буфера WASAPI на самом деле не изменяется (это тот, о котором сообщает GetBufferSize), он просто обрабатывается небольшими частями разного размера.

Если вы хотите заранее узнать, насколько большим будет следующий блок, вызовите IAudioCaptureClient::GetNextPacketSize (работает только в режиме совместного использования). Если все, что вы хотите сделать, - это предварительно распределить свои собственные буферы, чтобы вам не приходилось перераспределять при каждом вызове GetBuffer, вы можете просто установить свой собственный буфер, размер которого равен IAudioClient::GetBufferSize.

Как задокументировано на MSDN:

IAudioClient::Initialize Метод выделяет буфер. Клиент указывает длину буфера в значении параметра hnsBufferDuration, которое он передает методу Initialize. [...]

Для клиентов захвата длина буфера определяет максимальный объем данных захвата, которые аудиоустройство может прочитать из буфера конечной точки за один проход обработки. Клиент должен всегда звонить GetBufferSize после вызова Initialize определить фактический размер выделенного буфера, который может отличаться от запрошенного размера.

API реализует его таким образом, который имеет смысл для уровня захвата и нацелен на минимальные накладные расходы API. Он не накапливает данные внутренне без причины. Если вам нужны буферы фиксированного размера, вы можете накапливать данные в буфере, которым вы управляете.

Другие вопросы по тегам