2016-11-21 15 views
0

私はソケットから来るオーディオを再生しようとしています。しかし、オーディオはより多くのノイズを持っています(元のサウンドは来ていません)iOSのオーディオユニットを使用しているソケットからのオーディオからノイズを除去するにはどうすればよいですか?

私はスピーカーのための別のクラスを使用して、オーディオからノイズをフィルタリングしたいです。私のコードは

OSStatus WNSpeakerOutputProc(void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData) { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    WNSpeakerAudioData speakerAudioData; 
    speakerAudioData.outBuffer = ioData->mBuffers[0].mData; 
    speakerAudioData.outBufferSize = ioData->mBuffers[0].mDataByteSize; 


    [[(WNSpeaker *)inRefCon dataSource] supplyAudioData:&speakerAudioData]; 
    [pool drain]; 
    return noErr; 

} 

である私はあなただけのレンダリングオーディオに直接ソケットとパイプデータを開くことができないと言って始めたいあなたに

答えて

0

ありがとうございました、いくつかの提案 を教えてください。データをデジッタ処理するには、最小限の量のデータをバッファリングする必要があります。 TCPまたはUDPを使用していますか?もしUDPなら、あなたは紛失したパケットをどう扱っていますか?
一般に、オーディオコールバックでは何も遅くしたくないです。 AutoReleasePoolの作成と排水を削除することを強くお勧めします。

また、セレクタのsupplyAudioDataを呼び出すのではなく、ソースのデータを関数内のioDataに深くコピーすることをお勧めします。

WNSpeakerの詳細を提供するともっと役に立ちます。ソースのデータを宛先アドレス ioData->mBuffers[0].mDataにコピーし、inNumberFramesに基づいてnバイトをコピーする必要があります。

0

は、オーディオユニット

-(void) setupAudioUnit 
{ 
    AudioComponentDescription desc; 
    desc.componentType = kAudioUnitType_Output; 
    desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO; 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple; 
    desc.componentFlags = 0; 
    desc.componentFlagsMask = 0; 

    AudioComponent comp = AudioComponentFindNext(NULL, &desc); 

    OSStatus status; 

    status = AudioComponentInstanceNew(comp, &_audioUnit); 

    if(status != noErr) 
    { 
     NSLog(@"Error creating AudioUnit instance"); 
    } 

    // Enable input and output on AURemoteIO 
    // Input is enabled on the input scope of the input element 
    // Output is enabled on the output scope of the output element 

    UInt32 one = 1; 

    status = AudioUnitSetProperty(_audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &one, sizeof(one)); 


    if(status != noErr) 
    { 
     NSLog(@"Error enableling AudioUnit output bus"); 
    } 

    // Explicitly set the input and output client formats 
    // sample rate = 44100, num channels = 1, format = 16 bit int point 

    AudioStreamBasicDescription audioFormat = [self getAudioDescription]; 

    status = AudioUnitSetProperty(_audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &audioFormat, sizeof(audioFormat)); 

    if(status != noErr) 
    { 
     NSLog(@"Error setting audio format"); 
    } 

    AURenderCallbackStruct renderCallback; 
    renderCallback.inputProc = OutputRenderCallback; 
    renderCallback.inputProcRefCon = (__bridge void *)(self); 

    status = AudioUnitSetProperty(_audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, kOutputBus, &renderCallback, sizeof(renderCallback)); 

    if(status != noErr) 
    { 
     NSLog(@"Error setting rendering callback"); 
    } 

    // Initialize the AURemoteIO instance 
    status = AudioUnitInitialize(_audioUnit); 

    if(status != noErr) 
    { 
     NSLog(@"Error initializing audio unit"); 
    } 
} 

- (AudioStreamBasicDescription)getAudioDescription { 
    AudioStreamBasicDescription audioDescription = {0}; 
    audioDescription.mFormatID   = kAudioFormatLinearPCM; 
    audioDescription.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian; 
    audioDescription.mChannelsPerFrame = 1; 
    audioDescription.mBytesPerPacket = sizeof(SInt16)*audioDescription.mChannelsPerFrame; 
    audioDescription.mFramesPerPacket = 1; 
    audioDescription.mBytesPerFrame  = sizeof(SInt16)*audioDescription.mChannelsPerFrame; 
    audioDescription.mBitsPerChannel = 8 * sizeof(SInt16); 
    audioDescription.mSampleRate  = 8000.0; 
    return audioDescription; 
} 

私はComponentSubTypeとして8000サンプルレートとVoice_ProcessingIOを使用していますが、エコー(ノイズ)は、オーディオの確認してください をキャンセルなっていないのビルドコードでより詳細を見てみましょうこの1つです。ありがとうございました

関連する問題