Swift 如何将iPhone麦克风中的音频作为缓冲区传递

Swift 如何将iPhone麦克风中的音频作为缓冲区传递,swift,audio,buffer,avfoundation,unsafemutablepointer,Swift,Audio,Buffer,Avfoundation,Unsafemutablepointer,我正在尝试将iPhone麦克风录制的音频发送到ip摄像头。 我有一个sdk(用c编写)以便与相机通信,这是我需要传递数据的函数。我们正在谈论发送实时音频 /* @Name: FosSdk_SendTalkData. @Description: Send the data of talk. @param handle: the handle of current connection information. @param data: The data need to send. @par

我正在尝试将iPhone麦克风录制的音频发送到ip摄像头。 我有一个sdk(用c编写)以便与相机通信,这是我需要传递数据的函数。我们正在谈论发送实时音频

    /*
@Name: FosSdk_SendTalkData.
@Description: Send the data of talk.
@param handle: the handle of current connection information.
@param data: The data need to send.
@param len: Len of data.
@return: Please refer to the enum of FOSCMD_RESULT to get more information.
*/
FOSSDK FOSCMD_RESULT FOSAPI FosSdk_SendTalkData(FOSHANDLE handle, char *data, int len);
这是Swift签名(我目前正在使用Swift)

fosdk_SendTalkData(句柄:UInt32,数据:UnsafeMutablePointer!,len:Int32)
如何从iPhone麦克风录制音频并将音频缓冲区正确传递到sendTalkData? 提前感谢您的任何澄清/帮助

编辑

我设法使用AVFoundationavcaptureaudodataoutputsamplebufferdelegate函数获取音频缓冲区,从中我获得了一个示例缓冲区。但是,我的实现,不起作用。我注意到的一件事是,当向sendTalkFunction传递长度参数时,应用程序崩溃。例如,如果我将Int32(1)作为长度传递,则应用程序不会崩溃,但它没有传递Int32(1)的任何意义

这段代码对我帮助很大,但是它有点旧,所以我需要进行一些编辑

func captureOutput(\uCaptureOutput:AVCaptureOutput!,didOutputSampleBuffer sampleBuffer:CMSampleBuffer!,来自连接:AVCaptureConnection!){
guard let blockBufferRef=CMSampleBufferGetDataBuffer(sampleBuffer)else{return}
let lengthOfBlock=CMBlockBufferGetDataLength(blockBufferRef)
guard let data=NSMutableData(长度:Int(lengthOfBlock))else{return}
CMBlockBufferCopyDataBytes(blockBufferRef,0,lengthOfBlock,data.mutableBytes)
//我需要以UnsafemeutablePointer类型传递数据
让DataUnsafemtablePointer=data.mutableBytes.AssumingMemoryBind(到:Int8.self)
FosSdk_SendTalkData(CameraConfiguration Manager.mhandle、DataUnassemutablePointer、Int32(lengthOfBlock))
}
AVCaptureSessions正在正确启动,我可以看到每隔tot毫秒收集一次sampleBuffers。我只需要正确填充函数参数,并使这些音频缓冲区在ip摄像机上播放

FosSdk_SendTalkData(handle: UInt32, data: UnsafeMutablePointer<Int8>!, len: Int32)
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {

    guard let blockBufferRef = CMSampleBufferGetDataBuffer(sampleBuffer) else {return}
    let lengthOfBlock = CMBlockBufferGetDataLength(blockBufferRef)

    guard let data = NSMutableData(length: Int(lengthOfBlock)) else {return}
    CMBlockBufferCopyDataBytes(blockBufferRef, 0, lengthOfBlock, data.mutableBytes)

    // I need to pass the data as UnsafeMutablePointer<Int8> type
    let dataUnsafeMutablePointer = data.mutableBytes.assumingMemoryBound(to: Int8.self)

    FosSdk_SendTalkData(CameraConfigurationManager.mhandle, dataUnsafeMutablePointer, Int32(lengthOfBlock))

}