gpt4 book ai didi

ios - 获取 iPhone 麦克风数据以通过 Socket 进行流式传输

转载 作者:搜寻专家 更新时间:2023-10-31 22:47:55 26 4
gpt4 key购买 nike

我想从 iPhone 麦克风(NSData 格式)获取原始音频数据以通过套接字流式传输。这不是我可以使用 twilio/etc 的情况,因为它是一个研究项目。套接字实现已完成(我可以发送音频文件),但我无法获取流式麦克风数据。

这是我的尝试:

class ViewController: UIViewController, AVCaptureAudioDataOutputSampleBufferDelegate
{

override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

self.setupMicrophone()
}

override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func setupMicrophone()
{
let session = AVCaptureSession()
session.sessionPreset = AVCaptureSessionPresetMedium

let mic = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
var mic_input: AVCaptureDeviceInput!

let audio_output = AVCaptureAudioDataOutput()
audio_output.setSampleBufferDelegate(self, queue: dispatch_get_main_queue())

do
{
mic_input = try AVCaptureDeviceInput(device: mic)
}
catch
{
return
}

session.addInput(mic_input)
session.addOutput(audio_output)

session.startRunning()
}

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!)
{
// Do something here
}
}

问题:

  • 永远不会调用委托(delegate)函数。

  • 提供给委托(delegate)的数据(如果它被调用)不是 NSData,是否有另一个函数可以提供 NSData?有没有办法将 CMSampleBuffer 转换为 NSData?

感谢任何帮助。

干杯

最佳答案

您的 AVCaptureSession 超出范围并被释放。这就是为什么您的代表没有被调用的原因。您可以通过将 session 移动到类范围来解决此问题:

class ViewController: UIViewController, AVCaptureAudioDataOutputSampleBufferDelegate {

let session = AVCaptureSession()

override func viewDidLoad() {

一旦有了音频 CMSampleBuffer,就可以像这样将音频数据复制到 NSData 对象中:

let block = CMSampleBufferGetDataBuffer(sampleBuffer)
var length = 0
var data: UnsafeMutablePointer<Int8> = nil
let status = CMBlockBufferGetDataPointer(block!, 0, nil, &length, &data) // TODO: check for errors
let result = NSData(bytes: data, length: length)

附注如果你很小心并且想避免复制,你可以使用 NSData(bytesNoCopy: data, length: length, freeWhenDone: false)

关于ios - 获取 iPhone 麦克风数据以通过 Socket 进行流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com