How do I call CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer?

后端 未结 6 1085
北荒
北荒 2021-01-13 04:10

I\'m trying to figure out how to call this AVFoundation function in Swift. I\'ve spent a ton of time fiddling with declarations and syntax, and got this far.

6条回答
  •  清歌不尽
    2021-01-13 04:42

    Swift3 solution:

    func loopAmplitudes(audioFileUrl: URL) {
    
        let asset = AVAsset(url: audioFileUrl)
    
        let reader = try! AVAssetReader(asset: asset)
    
        let track = asset.tracks(withMediaType: AVMediaTypeAudio)[0]
    
        let settings = [
            AVFormatIDKey : kAudioFormatLinearPCM
        ]
    
        let readerOutput = AVAssetReaderTrackOutput(track: track, outputSettings: settings)
        reader.add(readerOutput)
        reader.startReading()
    
        while let buffer = readerOutput.copyNextSampleBuffer() {
    
            var audioBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil))
            var blockBuffer: CMBlockBuffer?
    
            CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
                buffer,
                nil,
                &audioBufferList,
                MemoryLayout.size,
                nil,
                nil,
                kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
                &blockBuffer
            );
    
            let buffers = UnsafeBufferPointer(start: &audioBufferList.mBuffers, count: Int(audioBufferList.mNumberBuffers))
    
            for buffer in buffers {
    
                let samplesCount = Int(buffer.mDataByteSize) / MemoryLayout.size
                let samplesPointer = audioBufferList.mBuffers.mData!.bindMemory(to: Int16.self, capacity: samplesCount)
                let samples = UnsafeMutableBufferPointer(start: samplesPointer, count: samplesCount)
    
                for sample in samples {
    
                    //do something with you sample (which is Int16 amplitude value)
    
                }
            }
        }
    }
    

提交回复
热议问题