2015-06-20 12 views
12

मुझे आईओएस में ऑडियो के साथ काम करने के लिए ऑनलाइन कई उदाहरण मिल गए हैं, लेकिन उनमें से अधिकतर पुराने हैं और जो भी मैं पूरा करने की कोशिश कर रहा हूं उस पर लागू नहीं होता हूं। यहां मेरी परियोजना है:स्विफ्ट के साथ आईओएस में ऑडियो नमूने कैप्चर कैसे करें?

मुझे दो स्रोतों से ऑडियो नमूने कैप्चर करने की आवश्यकता है - माइक्रोफ़ोन इनपुट और संग्रहीत ऑडियो फ़ाइलें। मुझे पूरे क्लिप के लिए "फिंगरप्रिंट" बनाने के लिए इन नमूनों पर एफएफटी करने की आवश्यकता है, साथ ही साथ कुछ अतिरिक्त फ़िल्टर भी लागू करने की आवश्यकता है। अंतिम लक्ष्य शाजम आदि जैसे गीत-पहचान सॉफ़्टवेयर का निर्माण करना है।

फास्ट फूरियर ट्रांसफॉर्म करने के लिए आईओएस 8 में अलग-अलग ऑडियो नमूने कैप्चर करने का सबसे अच्छा तरीका क्या है? मैं कल्पना करता हूं कि उनमें से एक बड़ी श्रृंखला के साथ समाप्त हो रहा है, लेकिन मुझे संदेह है कि यह इस तरह काम नहीं कर सकता है। दूसरा, मैं ऑडियो प्रोसेसिंग के लिए त्वरित फ्रेमवर्क का उपयोग कैसे कर सकता हूं? यह आईओएस में ऑडियो पर जटिल विश्लेषण करने का सबसे प्रभावी तरीका प्रतीत होता है।

मैंने जो उदाहरण देखे हैं, वे आईओएस और ऑब्जेक्टिव-सी के पुराने संस्करणों का उपयोग कर रहे हैं, और मैं उन्हें स्विफ्ट में सफलतापूर्वक अनुवाद करने में सक्षम नहीं हूं। क्या आईओएस 8 इस तरह की चीज के लिए कुछ नए ढांचे प्रदान करता है?

+0

आप ऐप्पल के अपने उदाहरणों को देखकर शुरू कर सकते हैं। वे उद्देश्य-सी में हो सकते हैं, लेकिन एपीआई बदल नहीं है। सभी vDSP_xx फ़ंक्शंस में किसी भी मामले में सी एपीआई है, और वास्तव में, आपके प्रोजेक्ट का विश्लेषण हिस्सा शायद सी या सी ++ में लिखा जाना चाहिए (यह आकस्मिक रूप से, इस साल के डब्ल्यूडब्ल्यूडीसी में ऐप्पल इंजीनियरों की सलाह है ऑडियो प्रसंस्करण लिखना/हैंडलर प्रस्तुत करना)। ऑडियो फिंगरप्रिंटिंग के लिए, यह एक गैर-मामूली समस्या है और SO के लिए भी बोर्ड है। – marko

+0

क्या आपको कुछ मिला? – hoangpx

उत्तर

7

आईओएस में तेज

रिकॉर्डिंग:

  • बनाएँ और एक AVAudioRecorder का एक उदाहरण बनाए रखने, var audioRecorder: AVAudioRecorder? = nil
  • में के रूप में एक यूआरएल के नमूने और कुछ रिकॉर्ड सेटिंग संग्रहीत करने के साथ प्रारंभ अपने AVAudioRecorder

रिकॉर्डिंग सत्र अनुक्रम:

  1. आह्वान prepareToRecord()
  2. आह्वान record()
  3. आह्वान stop()

पूरा स्विफ्ट/AVAudioRecorder उदाहरण

अपने रिकॉर्डिंग विधि के दिल में, आप हो सकता है:

func record() { 
    self.prepareToRecord() 
    if let recorder = self.audioRecorder { 
     recorder.record() 
    } 
} 

रिकॉर्डिंग (एक file पर स्ट्रीम) तैयार करने के लिए, आप हो सकता है:

func prepareToRecord() { 
    var error: NSError? 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString 
    let soundFileURL: NSURL? = NSURL.fileURLWithPath("\(documentsPath)/recording.caf") 

    self.audioRecorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as [NSObject : AnyObject], error: &error) 
    if let recorder = self.audioRecorder { 
     recorder.prepareToRecord() 
    } 
} 

अंत में, रिकॉर्डिंग बंद करने, इस का उपयोग करें:

ऊपर
func stopRecording() { 
    if let recorder = self.audioRecorder { 
     recorder.stop() 
    } 
} 

उदाहरण भी जरूरत है import AVFoundation और कुछ recordSettings, आपकी पसंद के लिए छोड़ दिया। recordSettings का एक उदाहरण कुछ ऐसा दिखाई देगा:

let recordSettings = [ 
    AVFormatIDKey: kAudioFormatAppleLossless, 
    AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue, 
    AVEncoderBitRateKey : 320000, 
    AVNumberOfChannelsKey: 2, 
    AVSampleRateKey : 44100.0 
] 

ऐसा करें, आपका काम हो गया।


तुम भी this Stack Overflow answer की जाँच करने के लिए है, जो एक demo project शामिल कर सकते हैं।

+2

यह जानकारी सहायक है, लेकिन मैं रिकॉर्डिंग से अलग-अलग ऑडियो नमूने कैसे निकाल सकता हूं? मुझे कच्चे डेटा की आवश्यकता है - अधिमानतः फ़्लोट्स की एक सरणी जिस पर मैं विश्लेषण कर सकता हूं। वही प्रश्न उस फ़ाइल पर लागू होता है जो पहले से डिस्क पर है। – hundley

+0

मान लीजिए कि आप ऊपर 'kAudioFormatAppleLossless' प्रारूप का उपयोग करते हैं, नमूने https://developer.apple.com/library/ios/documentation/MusicAudio/Reference/CAFSpec/CAF_overview/CAF_overview.html#/ पर प्रलेखित सीएएफ फ़ाइल में संग्रहीत हैं।/apple_ref/doc/यूआईडी/TP40001862-CH209-TPXREF101। ऐसी फ़ाइल से नमूने पढ़ने का उत्तर http://stackoverflow.com/questions/13996236/how-to-convert-wav-caf-files-sample-data-to-byte-array पर दिया गया है। – SwiftArchitect

+1

मुझे आपके http://swiftarchitect.com/recipes/#SO-32342486 बहुत उपयोगी होने के लिए मिला। धन्यवाद। – vivin

0

AVAudioEngine इस के लिए जाने का तरीका है। एप्पल डॉक्स से:

  • प्लेबैक और एक एकल ट्रैक की रिकॉर्डिंग के लिए, AVAudioPlayer और AVAudioRecorder का उपयोग करें।
  • अधिक जटिल ऑडियो प्रोसेसिंग के लिए, AVAudioEngine का उपयोग करें। AVAudioEngine में ऑडियो इनपुट और आउटपुट के लिए AVAudioInputNode और AVAudioOutputNode शामिल है। आप भी अपनी ऑडियो में प्रसंस्करण के लिए AVAudioNode वस्तुओं और मिश्रण प्रभाव का उपयोग कर सकते

मैं सीधे आप के साथ हो जाएगा: AVAudioEngine अस्पष्ट प्रलेखन, शायद ही कभी-उपयोगी त्रुटि संदेश के साथ एक बहुत ही नकचढ़ा एपीआई है, और लगभग कोई ऑनलाइन कोड उदाहरण सबसे बुनियादी कार्यों से अधिक प्रदर्शन करते हैं। लेकिन यदि आप छोटे सीखने की अवस्था को पाने के लिए समय लेते हैं, तो आप वास्तव में अपेक्षाकृत आसानी से कुछ जादुई चीजें कर सकते हैं।

मैं एक साधारण "खेल का मैदान" दृश्य नियंत्रक कि दोनों माइक्रोफोन और ऑडियो फ़ाइल नमूना संगठनों ने मिलकर काम करने को दर्शाता है का निर्माण किया है:

import UIKit 

class AudioEnginePlaygroundViewController: UIViewController { 
    private var audioEngine: AVAudioEngine! 
    private var mic: AVAudioInputNode! 
    private var micTapped = false 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     configureAudioSession() 
     audioEngine = AVAudioEngine() 
     mic = audioEngine.inputNode! 
    } 

    static func getController() -> AudioEnginePlaygroundViewController { 
     let me = AudioEnginePlaygroundViewController(nibName: "AudioEnginePlaygroundViewController", bundle: nil) 
     return me 
    } 

    @IBAction func toggleMicTap(_ sender: Any) { 
     if micTapped { 
      mic.removeTap(onBus: 0) 
      micTapped = false 
      return 
     } 

     let micFormat = mic.inputFormat(forBus: 0) 
     mic.installTap(onBus: 0, bufferSize: 2048, format: micFormat) { (buffer, when) in 
      let sampleData = UnsafeBufferPointer(start: buffer.floatChannelData![0], count: Int(buffer.frameLength)) 
     } 
     micTapped = true 
     startEngine() 
    } 

    @IBAction func playAudioFile(_ sender: Any) { 
     stopAudioPlayback() 
     let playerNode = AVAudioPlayerNode() 

     let audioUrl = Bundle.main.url(forResource: "test_audio", withExtension: "wav")! 
     let audioFile = readableAudioFileFrom(url: audioUrl) 
     audioEngine.attach(playerNode) 
     audioEngine.connect(playerNode, to: audioEngine.outputNode, format: audioFile.processingFormat) 
     startEngine() 

     playerNode.scheduleFile(audioFile, at: nil) { 
      playerNode .removeTap(onBus: 0) 
     } 
     playerNode.installTap(onBus: 0, bufferSize: 4096, format: playerNode.outputFormat(forBus: 0)) { (buffer, when) in 
      let sampleData = UnsafeBufferPointer(start: buffer.floatChannelData![0], count: Int(buffer.frameLength)) 
     } 
     playerNode.play() 
    } 

    // MARK: Internal Methods 

    private func configureAudioSession() { 
     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.mixWithOthers, .defaultToSpeaker]) 
      try AVAudioSession.sharedInstance().setActive(true) 
     } catch { } 
    } 

    private func readableAudioFileFrom(url: URL) -> AVAudioFile { 
     var audioFile: AVAudioFile! 
     do { 
      try audioFile = AVAudioFile(forReading: url) 
     } catch { } 
     return audioFile 
    } 

    private func startEngine() { 
     guard !audioEngine.isRunning else { 
      return 
     } 

     do { 
      try audioEngine.start() 
     } catch { } 
    } 

    private func stopAudioPlayback() { 
     audioEngine.stop() 
     audioEngine.reset() 
    } 
} 

ऑडियो नमूने installTap के पूरा होने के हैंडलर के माध्यम से आप के लिए दिया जाता है जो वास्तविक समय में टैप किए गए नोड (या तो माइक्रो या ऑडियो फ़ाइल प्लेयर) के माध्यम से लगातार ऑडियो पास के रूप में जाना जाता है। आप प्रत्येक ब्लॉक में नमूना डेटा पॉइंटर को अनुक्रमणित करके व्यक्तिगत नमूने तक पहुंच सकते हैं।

संबंधित मुद्दे