Какие значения использовать для размера пакета и кадра с AudioUnit

Я знакомлюсь с тем, как использовать AudioUnit для воспроизведения звуков, и меня смущают понятия пакетов и кадров. Я бы хотел знать:

  • что такое определение пакета и кадра в контексте AudioUnit

  • каковы возможности использования нескольких выборок в пакете и нескольких пакетов в кадре

Моя причина спросить: во всех примерах кода, которые я видел до сих пор, пакет, по сути, является образцом, обычно с mBytesPerPacket=4 для 16-битного стереопотока. А mFramesPerPacket обычно равен 1, что делает кадр, пакет и семпл (будь то стереосемпл) одними и теми же понятиями.

Я ожидал, что пакет и/или кадр будут буфером сэмплов, то есть группой из 256 или 512 последовательных сэмплов, на которые драйвер может указывать и считывать линейно. Уменьшение размера кадра/пакета до одного образца создает ненужную нагрузку на любой драйвер, который будет отвечать за воспроизведение данных. Что мне не хватает?


person double07    schedule 06.04.2011    source источник


Ответы (1)


Сначала несколько определений:

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

Вы не должны путать пакет и кадр, и на самом деле mFramesPerPacket обычно должно быть установлено в 1. Это не означает, что метод рендеринга вашего AudioUnit будет получать обратный вызов в каждом кадре. Если вы хотите контролировать, как часто это происходит, вам нужно установить для свойства kAudioSessionProperty_PreferredHardwareIOBufferDuration предпочтительный размер буфера. Установка этого свойства не гарантирует вам точный размер буфера, который вы запрашиваете, но система попытается дать вам что-то близкое к этому значению.

person Nik Reiman    schedule 06.04.2011
comment
И не смущайтесь, если симулятор не отвечает на запрошенный вами kAudioSessionProperty_PreferredHardwareIOBufferDuration, так как это свойство, по моему опыту, влияет только на устройство. - person Itamar Katz; 06.04.2011
comment
@ Итамар Да, отличная мысль. Симулятор использует системную конфигурацию CoreAudio и поэтому ведет себя немного иначе, чем iOS в нескольких отношениях, включая этот. - person Nik Reiman; 06.04.2011
comment
Спасибо. Разъяснения и определения высоко ценятся. - person double07; 06.04.2011
comment
Какой размер кадра в формате m4a? не могу получить значение амплитуды ( - person Denis Mikhaylov; 09.09.2011
comment
Просто чтобы уточнить пояснение, согласно глоссарию Core Audio, frame — это «набор семплов, который содержит один семпл из каждого канала в потоке аудиоданных». Другими словами, кадр содержит образец для всех каналов, а не только для одного. - person Ian Howson; 11.09.2013