2013-12-04 5 views
1

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

ответ

2

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

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

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

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

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

+0

Так что нет никакого способа изменить размер пакета. Там есть? – harsini

+1

Нет. Изменение задержки может изменить размер пакета как побочный эффект, но нет возможности явно указывать, насколько большими будут ваши пакеты. –

+0

Я не понимаю вашего значения изменения латентности. У меня возникла проблема, о которой я упоминал ниже. http://stackoverflow.com/questions/20899044/wasapi-capture-packet-size-pnumframestoread-varies-during-a-run – harsini

1

В documented on MSDN:

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

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

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

Смежные вопросы