2015-11-22 75 views
1

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

这里是我的尝试:

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 
    } 
} 

问题:

  • 委托函数永远不会被调用。

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

任何帮助表示赞赏。

干杯

回答

0

AVCaptureSession是走出去的范围和被释放。这就是为什么你的委托没有被调用。

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) 

附注:您可以通过移动session类范围解决这个问题如果您小心并且希望避免复制,则可以使用NSData(bytesNoCopy: data, length: length, freeWhenDone: false)

+0

看起来这可能是问题。我会测试并回复你! –

+0

@ rythmic-fistman第一部分作品完美! 然而,当我使用的是第二部分,我收到错误: 的malloc:***错误对象0x1035662c0:被释放的指针没有被分配***设置malloc_error_break断点调试 知道为什么这将会? –

+0

不 - 这到底发生了什么? –