2015-11-22 134 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

不 - 這到底發生了什麼? –