Понимание AudioStreamBasicDescription - PullRequest
       25

Понимание AudioStreamBasicDescription

1 голос
/ 02 октября 2019

Я пытаюсь понять результаты AudioStreamBasicDescription. Практически не то, что я могу получить, имеет для меня смысл. Например:

AudioStreamBasicDescription (mSampleRate: 44100.0, mFormatID: 1819304813, mFormatFlags: 41, mBytesPerPacket: 4, mFramesPerPacket: 1, mBytesPerFrame: 4, mChannelsPer: 2 *, 0 * 0: 0 * 0: 0 * M3: 0 * 0: 0 * * *): 0

Что бы я ожидал: «Байт на пакет» и «Байт на кадр» должны быть 8, а не 4:

4 (размер 32-разрядного числа с плавающей запятой) x 2 (два канала на кадр) x 1 (1 кадр на пакет) = 8 байтов

Почему это 4?

import CoreAudio
import AudioUnit

var inputUnitDescription = AudioComponentDescription(componentType: kAudioUnitType_Output,
                                                     componentSubType: kAudioUnitSubType_HALOutput,
                                                     componentManufacturer: kAudioUnitManufacturer_Apple,
                                                     componentFlags: 0,
                                                     componentFlagsMask: 0)
let defaultInput = AudioComponentFindNext(nil, &inputUnitDescription)

var inputUnit: AudioUnit?
AudioComponentInstanceNew(defaultInput!, &inputUnit)

var asbd = AudioStreamBasicDescription()
var propertySize = UInt32(MemoryLayout<AudioStreamBasicDescription>.size)
AudioUnitGetProperty(inputUnit!,
                     kAudioUnitProperty_StreamFormat,
                     kAudioUnitScope_Output,
                     1,
                     &asbd,
                     &propertySize)

dump(asbd)

1 Ответ

1 голос
/ 02 октября 2019

Ваш ABSD имеет mFormatFlags == 41.

if (mFormatFlags & 32)! = 0, это означает, что формат включает бит kAudioFormatFlagIsNonInterleaved.

Формат без чередования возвращает только одинканал данных на кадр, а не 2. Вместо этого вы получаете несколько буферов, каждый из которых содержит только один канал на кадр, или 4 байта (для формата Float32), а не 8.

...