【问题标题】:Swift 3: Using AVCaptureAudioDataOutput to analyze audio inputSwift 3:使用 AVCaptureAudioDataOutput 分析音频输入
【发布时间】:2017-01-24 02:09:42
【问题描述】:

我正在尝试使用 AVCaptureAudioDataOutput 来分析音频输入,如 here 所述。这不是我自己能弄清楚的东西,所以我复制了这个例子,但我遇到了困难。

Swift 3 中的 Xcode 促使我进行了一些更改。分配samples 的行出现编译错误。 Xcode 说,“不能使用类型为‘(UnsafeMutableRawPointer?)’的参数列表调用类型‘UnsafeMutablePointer<_> 的初始化程序”

这是我修改后的代码:

func captureOutput(_ captureOutput: AVCaptureOutput!,
                    didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,
                   from connection: AVCaptureConnection!){
    var buffer: CMBlockBuffer? = nil
    var audioBufferList = AudioBufferList(mNumberBuffers: 1,
                                          mBuffers: AudioBuffer(mNumberChannels: 1, mDataByteSize: 0, mData: nil))
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
        sampleBuffer,
        nil,
        &audioBufferList,
        MemoryLayout<AudioBufferList>.size,     // changed for Swift 3
        nil,
        nil,
        UInt32(kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment),
        &buffer
    )
    let abl = UnsafeMutableAudioBufferListPointer(&audioBufferList)
    var sum:Int64 = 0
    var count:Int = 0
    var bufs:Int = 0
    for buf in abl {
        let samples = UnsafeMutableBufferPointer<Int16>(start: UnsafeMutablePointer(buf.mData),  // Error here
                                                        count: Int(buf.mDataByteSize)/sizeof(Int16))
        for sample in samples {
            let s = Int64(sample)
            sum = (sum + s*s)
            count += 1
        }
        bufs += 1
    }
    print( "found \(count) samples in \(bufs) buffers, sum is \(sum)" )
}

谁能告诉我如何修复这个代码?

【问题讨论】:

    标签: ios swift3 avcapturesession audiobuffer


    【解决方案1】:

    答案是我需要将buf.mData 包裹在OpaquePointer 中。即,在对UnsafeMutableBufferPointer&lt;Int16&gt;(OpaquePointer(buff.mData)) 的调用中,更改

    start: UnsafeMutablePointer(buff.mData)
    

    start: UnsafeMutablePointer(OpaquePointer(buff.mData))
    

    这里是完整的代码,为 Swift 3 更新:

        func captureOutput(_ captureOutput: AVCaptureOutput!,
                       didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,
                       from connection: AVCaptureConnection!){
        var buffer: CMBlockBuffer? = nil
        var audioBufferList = AudioBufferList(mNumberBuffers: 1,
                                              mBuffers: AudioBuffer(mNumberChannels: 1, mDataByteSize: 0, mData: nil))
        CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
            sampleBuffer,
            nil,
            &audioBufferList,
            MemoryLayout<AudioBufferList>.size,
            nil,
            nil,
            UInt32(kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment),
            &buffer
        )
        let abl = UnsafeMutableAudioBufferListPointer(&audioBufferList)
        var sum:Int64 = 0
        var count:Int = 0
        var bufs:Int = 0
        for buff in abl {
            let samples = UnsafeMutableBufferPointer<Int16>(start: UnsafeMutablePointer(OpaquePointer(buff.mData)),
                                                            count: Int(buff.mDataByteSize)/MemoryLayout<Int16>.size)
            for sample in samples {
                let s = Int64(sample)
                sum = (sum + s*s)
                count += 1
            }
            bufs += 1
        }
        print( "found \(count) samples in \(bufs) buffers, RMS is \(sqrt(Float(sum)/Float(count)))" )
    }
    

    这让编译器很满意,而且似乎生成了合理的数字。

    【讨论】:

    • 我正在录制视频,方法是使用 CMSampleBufferGetImageBuffer 从 sampleBuffer 获取图像,修改图像,然后将其写入视频。如何检查sampleBuffer是否为音频,然后将其写入assetWriter?
    • @ChewieTheChorkie 要检查样本缓冲区是否为音频,您可以查看connection 的属性output。像这样,if connection.output is AVCaptureAudioDataOutput { ... } else { // isVideo }
    • 也许我会尝试一下,但我通过运行 AVAudioRecorder 并在最后合并音频和视频来“修复”它。这很糟糕吗?
    • @ChewieTheChorkie 非常有用的提示!你找到更好的解决方案了吗?我有同样的问题(当我尝试在实时视频录制中绘制多个上下文时没有音频输出)
    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多