首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMSampleBuffer样本值

CMSampleBuffer样本值
EN

Stack Overflow用户
提问于 2018-07-04 05:58:12
回答 1查看 715关注 0票数 2

我正在尝试从CMSampleBuffer访问示例,以便进行进一步的处理(主要是可视的),下面是我的代码:

代码语言:javascript
复制
 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    var audioBufferList = AudioBufferList()
    var blockBuffer : CMBlockBuffer?

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, nil, &audioBufferList, MemoryLayout<AudioBufferList>.size, nil, nil, 0, &blockBuffer)

    let buffers = UnsafeBufferPointer<AudioBuffer>(start: &audioBufferList.mBuffers, count: Int(audioBufferList.mNumberBuffers))

    var data  =  audioBufferList.mBuffers.mData

    let pointer = data?.assumingMemoryBound(to: Float.self)

    let floatPointer = data?.bindMemory(to: Float.self, capacity: 1024)
    let floatBuffer = UnsafeBufferPointer(start: floatPointer, count: 1024)
    let outputArray = Array(floatBuffer)
    print(outputArray[0..<20])

}

我正在得到结果,但它们似乎以一种奇怪的(对我来说)的形式出现,就像这样(打印语句的输出):

代码语言:javascript
复制
[-snan(0x1dff94), -nan(0x15ffba), 2.93871626e-39, 2.29594486e-39, 8.26537682e-40, -nan(0x1affef), -nan(0xeffe0), 2.84690739e-39, 4.95919386e-39, 4.86737658e-39, 1.19389788e-39, -nan(0x8ffe4), -snan(0xaffa6), -3.29645785e+38, -snan(0x17ff85), -nan(0x5ffae), 2.66320417e-39, 2.11228928e-39, -nan(0x2fff6), -nan(0x19ffd6)]
[-2.45903224e+38, -3.13694095e+38, -snan(0xdff85), -nan(0xbffb4), -snan(0x11ffba), -2.83122967e+38, -2.41915276e+38, -2.67170487e+38, -2.83122724e+38, -2.73817357e+38, -2.39257084e+38, -1.50864781e+38, -1.34249056e+38, -1.71464408e+38, -2.53878186e+38, -2.48561761e+38, -2.64512051e+38, -3.19011393e+38, -snan(0x12ff96), -snan(0x1bffb7)]

问题是如何以“正常”CMSampleBuffer AVAudioPCMBuffer的方式访问AVAudioPCMBuffer示例?

FloatChannelData,还是我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 23:14:20

当我创建和AVCaptureAudioDataOutput示例时,我得到的是Int16s (不确定是否可以为Floats配置),当用修改过的代码打印时,它们非常有意义:

代码语言:javascript
复制
let intPointer = data?.bindMemory(to: Int16.self, capacity: 1024)

音频Int16记录在任何地方吗?如果不是,可以通过查看示例缓冲区的AudioStreamBasicDescription来检查它的格式。

代码语言:javascript
复制
let asbd = CMAudioFormatDescriptionGetStreamBasicDescription(CMSampleBufferGetFormatDescription(sampleBuffer)!)!.pointee

或者开始使用斯威夫特4,以获得更好的可读性。

代码语言:javascript
复制
let asbd = sampleBuffer.formatDescription!.audioStreamBasicDescription!.pointee
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51166673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档