2016-05-01 7 views
8

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

मैं बोले कोड के साथ संघर्ष कर रहा हूं।

let preferredIOBufferDuration = 0.005 
let kInputBus = AudioUnitElement(1) 
let kOutputBus = AudioUnitElement(0) 

init() { 
    // This is my Audio Unit settings code. 
    var status: OSStatus 

    do { 
     try AVAudioSession.sharedInstance().setPreferredIOBufferDuration(preferredIOBufferDuration) 
    } catch let error as NSError { 
     print(error) 
    } 


    var desc: AudioComponentDescription = AudioComponentDescription() 
    desc.componentType = kAudioUnitType_Output 
    desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO 
    desc.componentFlags = 0 
    desc.componentFlagsMask = 0 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple 

    let inputComponent: AudioComponent = AudioComponentFindNext(nil, &desc) 

    status = AudioComponentInstanceNew(inputComponent, &audioUnit) 
    checkStatus(status) 

    var flag = UInt32(1) 
    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, kInputBus, &flag, UInt32(sizeof(UInt32))) 
    checkStatus(status) 

    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &flag, UInt32(sizeof(UInt32))) 
    checkStatus(status) 

    var audioFormat: AudioStreamBasicDescription! = AudioStreamBasicDescription() 
    audioFormat.mSampleRate = 8000 
    audioFormat.mFormatID = kAudioFormatLinearPCM 
    audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked 
    audioFormat.mFramesPerPacket = 1 
    audioFormat.mChannelsPerFrame = 1 
    audioFormat.mBitsPerChannel = 16 
    audioFormat.mBytesPerPacket = 2 
    audioFormat.mBytesPerFrame = 2 

    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, kInputBus, &audioFormat, UInt32(sizeof(UInt32))) 
    checkStatus(status) 


    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 
    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &audioFormat, UInt32(sizeof(UInt32))) 
    checkStatus(status) 


    // Set input/recording callback 
    var inputCallbackStruct: AURenderCallbackStruct! = AURenderCallbackStruct(inputProc: recordingCallback, inputProcRefCon: UnsafeMutablePointer(unsafeAddressOf(self))) 
    inputCallbackStruct.inputProc = recordingCallback 
    inputCallbackStruct.inputProcRefCon = UnsafeMutablePointer(unsafeAddressOf(self)) 
    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, kInputBus, &inputCallbackStruct, UInt32(sizeof(UInt32))) 
    checkStatus(status) 


    // Set output/renderar/playback callback 
    var renderCallbackStruct: AURenderCallbackStruct! = AURenderCallbackStruct(inputProc: playbackCallback, inputProcRefCon: UnsafeMutablePointer(unsafeAddressOf(self))) 
    renderCallbackStruct.inputProc = playbackCallback 
    renderCallbackStruct.inputProcRefCon = UnsafeMutablePointer(unsafeAddressOf(self)) 
    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, kOutputBus, &renderCallbackStruct, UInt32(sizeof(UInt32))) 
    checkStatus(status) 


    flag = 0 
    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_ShouldAllocateBuffer, kAudioUnitScope_Output, kInputBus, &flag, UInt32(sizeof(UInt32))) 
} 


func recordingCallback(inRefCon: UnsafeMutablePointer<Void>, 
         ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, 
         inTimeStamp: UnsafePointer<AudioTimeStamp>, 
         inBufNumber: UInt32, 
         inNumberFrames: UInt32, 
         ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus { 

    print("recordingCallback got fired >>>") 


    return noErr 
} 



func playbackCallback(inRefCon: UnsafeMutablePointer<Void>, 
         ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, 
         inTimeStamp: UnsafePointer<AudioTimeStamp>, 
         inBufNumber: UInt32, 
         inNumberFrames: UInt32, 
         ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus { 

    print("playbackCallback got fired <<<") 


    return noErr 
} 

उस कोड के साथ, केवल recordingCallback विधि कॉल हो रही है। और playbackCallback विधि को बिल्कुल नहीं निकाल दिया जा रहा है। मुझे यकीन है कि मैं यहाँ कुछ गलत कर रहा हूँ। क्या कोई भी मेरी इस के साथ मदद कर सकता है। मैं इस समस्या पर अपने सिर को टक्कर लगी हूं।

+0

ऑडियोयूनीट var कहां है? –

उत्तर

4

आप InputCallback और RenderCallback विधि गलत तरीके से सेट कर रहे हैं। अन्य सेटिंग्स ठीक लगता है। तो आपकी init विधि इस तरह होनी चाहिए।

init() { 

    var status: OSStatus 

    do { 
     try AVAudioSession.sharedInstance().setPreferredIOBufferDuration(preferredIOBufferDuration) 
    } catch let error as NSError { 
     print(error) 
    } 


    var desc: AudioComponentDescription = AudioComponentDescription() 
    desc.componentType = kAudioUnitType_Output 
    desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO 
    desc.componentFlags = 0 
    desc.componentFlagsMask = 0 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple 

    let inputComponent: AudioComponent = AudioComponentFindNext(nil, &desc) 

    status = AudioComponentInstanceNew(inputComponent, &audioUnit) 
    checkStatus(status) 

    var flag = UInt32(1) 
    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, kInputBus, &flag, UInt32(sizeof(UInt32))) 
    checkStatus(status) 

    status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &flag, UInt32(sizeof(UInt32))) 
    checkStatus(status) 

    var audioFormat: AudioStreamBasicDescription! = AudioStreamBasicDescription() 
    audioFormat.mSampleRate = 8000 
    audioFormat.mFormatID = kAudioFormatLinearPCM 
    audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked 
    audioFormat.mFramesPerPacket = 1 
    audioFormat.mChannelsPerFrame = 1 
    audioFormat.mBitsPerChannel = 16 
    audioFormat.mBytesPerPacket = 2 
    audioFormat.mBytesPerFrame = 2 

    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, kInputBus, &audioFormat, UInt32(sizeof(UInt32))) 
    checkStatus(status) 


    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 
    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &audioFormat, UInt32(sizeof(UInt32))) 
    checkStatus(status) 


    // Set input/recording callback 
    var inputCallbackStruct = AURenderCallbackStruct(inputProc: recordingCallback, inputProcRefCon: UnsafeMutablePointer(unsafeAddressOf(self))) 
    AudioUnitSetProperty(audioUnit, AudioUnitPropertyID(kAudioOutputUnitProperty_SetInputCallback), AudioUnitScope(kAudioUnitScope_Global), 1, &inputCallbackStruct, UInt32(sizeof(AURenderCallbackStruct))) 


    // Set output/renderar/playback callback 
    var renderCallbackStruct = AURenderCallbackStruct(inputProc: playbackCallback, inputProcRefCon: UnsafeMutablePointer(unsafeAddressOf(self))) 
    AudioUnitSetProperty(audioUnit, AudioUnitPropertyID(kAudioUnitProperty_SetRenderCallback), AudioUnitScope(kAudioUnitScope_Global), 0, &renderCallbackStruct, UInt32(sizeof(AURenderCallbackStruct))) 


    flag = 0 
    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_ShouldAllocateBuffer, kAudioUnitScope_Output, kInputBus, &flag, UInt32(sizeof(UInt32))) 
} 

इस कोड के साथ प्रयास करें और हमें बताएं कि इससे मदद मिलती है।

+1

रिकॉर्ड के लिए इस कोड का उपयोग कैसे करें और बात करते समय माइक की तरह वापस खेलें स्पीकर में खेलेंगे –

+0

आप कहां रिकॉर्ड कर सकते हैं कि आप कौन सी डिवाइस रिकॉर्डिंग चाहते हैं? आईफोन एक हेडसेट बनाम आईफोन? – Surz

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