2017-02-03 6 views
5

時間をかけて質問を読んでくれてありがとう!iOS - ストリームからオーディオを読み込んでオーディオを再生する方法

私はMultipeerConnectivityを使用してストリームを作成しました。オーディオをCMSampleBufferに記録し、そのバッファをUInt8データに変換することができました。そして、この方法を使用してピアにそのデータを送信します。データはInputStreamの上に示したときに

outputStream!.write(u8ptr, maxLength: Int(buffer.mDataByteSize)) 

は、その後、次のメソッドが呼び出されます。

func stream(_ aStream: Stream, handle eventCode: Stream.Event) { 

私はprint文を持っているので、この部分が実行されています良い。データが実際に現れたとき、私は私が実際にストリームから読み取るためにinputStream.readメソッドを呼び出す必要があることを知っているが、私は実際にそのデータを読み込み、するかどうかはわかりません

func readFromStream() { 

私の関数を呼び出しますAVAudioPlayerを使用して再生できるようにNSDataに変換します。

(あなたがより良い、より効率的な方法を知っている場合を除き)

これは私がこれまで持っているものですが、私はそれをテストしていないと私は問題があるように起こっていると仮定します。

func readFromStream() { 
    var buffer = [UInt8](repeating: 0, count: 1024) 

    while (inputStream!.hasBytesAvailable) { 
     let length = inputStream!.read(&buffer, maxLength: buffer.count) 

     if (length > 0) { 

      if (audioEngine!.isRunning) { 
       audioEngine!.stop() 
       audioEngine!.reset() 
      } 

      print("\(#file) > \(#function) > \(length) bytes read") 

      let audioBuffer = bytesToAudioBuffer(buffer) 
      let mainMixer = audioEngine!.mainMixerNode 

      audioEngine!.connect(audioPlayer!, to: mainMixer, format: audioBuffer.format) 

      audioPlayer!.scheduleBuffer(audioBuffer, completionHandler: nil) 

      do { 
       try audioEngine!.start() 
      } 
      catch let error as NSError { 
       print("\(#file) > \(#function) > error: \(error.localizedDescription)") 
      } 

      audioPlayer!.play() 
     } 
    } 
} 

私の考えに基づいて、オーディオは再生されません。それは沈黙ですが、オーディオがデバイスの1つで受信されていることがわかります。

基本的に私の質問は、このバッファを正しいデータ型に変換してライブで再生できるようにすることです。

ありがとうございました!詳しい情報が必要な場合は、私に知らせてください。 NSDataのにUINT8を変換するには

答えて

4

よりもむしろ私はAVAudioPCMBuffersを使用CMSampleBuffersを使用してを使用する、ことをやったら。これらは、AVAudioEngineから録音することで作成できます。基本的にここで私はAVAudioPCMBufferをNSDataに変換して返します。

func audioBufferToNSData(PCMBuffer: AVAudioPCMBuffer) -> NSData { 
    let channelCount = 1 // given PCMBuffer channel count is 1 
    let channels = UnsafeBufferPointer(start: PCMBuffer.floatChannelData, count: channelCount) 
    let data = NSData(bytes: channels[0], length:Int(PCMBuffer.frameLength * PCMBuffer.format.streamDescription.pointee.mBytesPerFrame)) 

    return data 
} 

func dataToPCMBuffer(format: AVAudioFormat, data: NSData) -> AVAudioPCMBuffer { 

    let audioBuffer = AVAudioPCMBuffer(pcmFormat: format, 
             frameCapacity: UInt32(data.length)/format.streamDescription.pointee.mBytesPerFrame) 

    audioBuffer.frameLength = audioBuffer.frameCapacity 
    let channels = UnsafeBufferPointer(start: audioBuffer.floatChannelData, count: Int(audioBuffer.format.channelCount)) 
    data.getBytes(UnsafeMutableRawPointer(channels[0]) , length: data.length) 
    return audioBuffer 
} 
4

>NSData from UInt8

あなただけのAVAudioPlayer

let player = AVAudioPlayer(data: data) 
player.play() 
関連する問題