0

我正在尝试访问 mSampleRate 和 mChannelsPerFrame 并将值分配给全局变量。

方法:

func setAudioFormat(format: CMFormatDescriptionRef) {
    let asbd: UnsafePointer<AudioStreamBasicDescription> = CMAudioFormatDescriptionGetStreamBasicDescription(format)

    sampleRate = asbd.memory.mSampleRate // breakpoint
    channels = asbd.memory.mChannelsPerFrame

}

方法调用:

func captureOutput(captureOutput: AVCaptureOutput!, var didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
    ...

    let format: CMFormatDescriptionRef = CMSampleBufferGetFormatDescription(sampleBuffer)!
    self.setAudioFormat(format)

    ...
}

难道我做错了什么?有没有更好的方法从捕获输出样本缓冲区中获取 AudioStreamBasicDescription

编辑:

格式保存这些值:

<CMAudioFormatDescription 0x14516150 [0x346c08a0]> {
mediaType:'soun' 
mediaSubType:'lpcm' 
mediaSpecific: {
    ASBD: {
        mSampleRate: 44100.000000 
        mFormatID: 'lpcm' 
        mFormatFlags: 0xc 
        mBytesPerPacket: 2 
        mFramesPerPacket: 1 
        mBytesPerFrame: 2 
        mChannelsPerFrame: 1 
        mBitsPerChannel: 16     } 
    cookie: {(null)} 
    ACL: {(null)} 
} 
extensions: {(null)}
}
4

1 回答 1

1

一旦你有了一个CMFormatDescriptionRef实例,你就可以使用这个代码(在 Objective-C 中,对不起)来检索 ASBD 数据:

const AudioFormatListItem *audioFormatListItem = CMAudioFormatDescriptionGetFormatList(formatDescription, nil);
AudioStreamBasicDescription asbd = audioFormatListItem->mASBD;
float sampleRate = asbd.mSampleRate;
于 2018-01-20T16:22:31.497 回答