如何将Swift中的CMSampleBuffer转换为数据?

问题描述:

我需要将CMSampleBuffer转换为Data格式。我正在使用一个第三方框架进行音频相关任务。该框架为我提供了CMSampleBuffer对象中的流媒体(即实时音频)音频。如何将Swift中的CMSampleBuffer转换为数据?

像这样:

func didAudioStreaming(audioSample: CMSampleBuffer!) { 
    //Here I need to conver this to Data format. 
    //Because I am using GRPC framework for Audio Recognization, 
} 

请提供给我的步骤来转换CMSampleBufferData

FYI

let formatDesc:CMFormatDescription? = CMSampleBufferGetFormatDescription(audioSample) 

    <CMAudioFormatDescription 0x17010d890 [0x1b453ebb8]> { 
    mediaType:'soun' 
    mediaSubType:'lpcm' 
    mediaSpecific: { 
     ASBD: { 
      mSampleRate: 16000.000000 
      mFormatID: 'lpcm' 
      mFormatFlags: 0xc 
      mBytesPerPacket: 2 
      mFramesPerPacket: 1 
      mBytesPerFrame: 2 
      mChannelsPerFrame: 1 
      mBitsPerChannel: 16  } 
     cookie: {(null)} 
     ACL: {(null)} 
     FormatList Array: {(null)} 
    } 
    extensions: {(null)} 
} 
+0

请问你是怎么在16000的采样率记录?我已经打电话给'''session.setPreferredSampleRate''',但我不断收到采样率44100 –

尝试下面的代码CMSampleBuffer转换为NSData的。

let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
CVPixelBufferLockBaseAddress(imageBuffer!, CVPixelBufferLockFlags(rawValue: 0)) 
let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer!) 
let height = CVPixelBufferGetHeight(imageBuffer!) 
let src_buff = CVPixelBufferGetBaseAddress(imageBuffer!) 
let data = NSData(bytes: src_buff, length: bytesPerRow * height) 
CVPixelBufferUnlockBaseAddress(imageBuffer!, CVPixelBufferLockFlags(rawValue: 0)) 

编辑 -

对于AudioBuffer使用下面的代码 -

var audioBufferList = AudioBufferList() 
var data = Data() 
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)) 

for audioBuffer in buffers { 
    let frame = audioBuffer.mData?.assumingMemoryBound(to: UInt8.self) 
    data.append(frame!, count: Int(audioBuffer.mDataByteSize)) 
} 
+0

谢谢Nilesh,但我正在接收音频样本而不是视频或图像。它适用于我的情况吗? – Sridhar

+0

@Sridhar我编辑了我的答案,请让我知道你是否适合你。 – Nilesh

+0

感谢Nileash,我用你更新的答案,我越来越 - 错误域= NSOSStatusErrorDomain代码= 1954115647“(空)”这个错误来自AudioPlayer – Sridhar