2017-02-03 12 views
5

कैसे खेलें, प्रश्न पढ़ने के लिए समय लेने वाले सभी को धन्यवाद!आईओएस - स्ट्रीम से ऑडियो कैसे पढ़ा जाए और ऑडियो

इसलिए मैंने मल्टीपायर कनेक्टिविटी का उपयोग करके एक स्ट्रीम बनाई है। मैं एक CMSampleBuffer में ऑडियो रिकॉर्ड करने में सक्षम हूं और उस बफर को UInt8 डेटा में रूपांतरित कर सकता हूं।

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

फिर जब डेटा InputStream पर दिखाई देता है निम्न विधि कहा जाता है:: फिर विधि का उपयोग कर एक सहकर्मी के लिए कि डेटा भेजने

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

मैं प्रिंट बयान है, इसलिए इस भाग चल रहा है ठीक। डेटा वास्तव में दिखाई देता है, मैं अपने फ़ंक्शन को कॉल

func readFromStream() { 

मुझे पता है कि मैं वास्तव में स्ट्रीम से पढ़ने का inputStream.read विधि कॉल करने की जरूरत है, लेकिन मुझे यकीन है कि वास्तव में डेटा को पढ़ने के लिए कैसे नहीं कर रहा हूँ और उसके बाद इसे NSData में परिवर्तित करें ताकि इसे AVAudioPlayer का उपयोग करके खेला जा सके।

यह वही है मैं अब तक है, लेकिन मैं यह परीक्षण नहीं किया और मुझे लगता है है (जब तक आप एक बेहतर, अधिक कुशलता से के बारे में पता कर रहे हैं) वहाँ समस्याओं होने जा रहा है।

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

मैं क्या है के आधार पर, वहाँ कोई ऑडियो चल रहा है। यह चुप्पी है, लेकिन मैं देख सकता हूं कि एक डिवाइस द्वारा ऑडियो प्राप्त किया जा रहा है।

तो मूल रूप से, मेरा सवाल यह है कि, मैं इस बफर को सही डेटा प्रकार में कैसे परिवर्तित करूं ताकि इसे लाइव खेला जा सके?

आपकी मदद के लिए धन्यवाद! अगर आपको अधिक जानकारी चाहिए, तो कृपया मुझे बताएं।

उत्तर

4

का उपयोग करें। इन्हें 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 में UInt8 परिवर्तित करने के लिए>NSData from UInt8

एक बार जब आप यह कर लें, सिर्फ बल्कि CMSampleBuffers मैं AVAudioPCMBuffers इस्तेमाल किया उपयोग करने की तुलना AVAudioPlayer

let player = AVAudioPlayer(data: data) 
player.play() 
संबंधित मुद्दे