美文网首页
AudioUnit 基本用法

AudioUnit 基本用法

作者: 冬的天 | 来源:发表于2018-01-08 17:32 被阅读0次

    IOS音频架构之Audio Unit  :http://blog.csdn.net/u014011807/article/details/46980699

    音频单元组件服务参考(Audio Unit Component Services Reference)  http://www.lxway.com/802012256.htm

    1、描述音频单元

    AudioComponentDescription desc;

        desc.componentType = kAudioUnitType_Output;

        desc.componentSubType = kAudioUnitSubType_RemoteIO;

        desc.componentFlags = 0;

        desc.componentFlagsMask = 0;

        desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    2、查找音频单元

    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);

    3、获取音频单元实例

    status = AudioComponentInstanceNew(inputComponent, &audioUnit);

    4、启用录制功能、启用播放功能

    UInt32 flag = 1;

        status = AudioUnitSetProperty(audioUnit,

                                      kAudioOutputUnitProperty_EnableIO,

                                      kAudioUnitScope_Input,

                                      kInputBus,

                                      &flag,

                                      sizeof(flag));

     status = AudioUnitSetProperty(audioUnit,

                                      kAudioOutputUnitProperty_EnableIO,

                                      kAudioUnitScope_Output,

                                      kOutputBus,

                                      &flag,

                                      sizeof(flag));

    5、音频流描述

    AudioStreamBasicDescription audioFormat;

        audioFormat.mSampleRate

    = 44100.00;

        audioFormat.mFormatID

    = kAudioFormatLinearPCM;

        audioFormat.mFormatFlags

    = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

        audioFormat.mFramesPerPacket

    = 1;

        audioFormat.mChannelsPerFrame

    = 1;

        audioFormat.mBitsPerChannel

    = 16;

        audioFormat.mBytesPerPacket

    = 2;

        audioFormat.mBytesPerFrame

    = 2;

    6、应用录制和播放的音频流描述

    status = AudioUnitSetProperty(audioUnit,

                                      kAudioUnitProperty_StreamFormat,

                                      kAudioUnitScope_Output,

                                      kInputBus,

                                      &audioFormat,

                                      sizeof(audioFormat));

        status = AudioUnitSetProperty(audioUnit,

                                      kAudioUnitProperty_StreamFormat,

                                      kAudioUnitScope_Input,

                                      kOutputBus,

                                      &audioFormat,

                                      sizeof(audioFormat));

    7、设置回调

        AURenderCallbackStruct callbackStruct;

        callbackStruct.inputProc = recordingCallback;

        callbackStruct.inputProcRefCon = self;

        status = AudioUnitSetProperty(audioUnit,

                                      kAudioOutputUnitProperty_SetInputCallback,

                                      kAudioUnitScope_Global,

                                      kInputBus,

                                      &callbackStruct,

                                      sizeof(callbackStruct));

        callbackStruct.inputProc = playbackCallback;

        callbackStruct.inputProcRefCon = self;

        status = AudioUnitSetProperty(audioUnit,

                                      kAudioUnitProperty_SetRenderCallback,

                                      kAudioUnitScope_Global,

                                      kOutputBus,

                                      &callbackStruct,

                                      sizeof(callbackStruct));

    8、回调方法

    static OSStatus recordingCallback(void *inRefCon,

                                      AudioUnitRenderActionFlags *ioActionFlags,

                                      const AudioTimeStamp *inTimeStamp,

                                      UInt32 inBusNumber,

                                      UInt32 inNumberFrames,

                                      AudioBufferList *ioData) {

        AudioBufferList *bufferList;     

        OSStatus status = AudioUnitRender([(shockmanViewController *)inRefCon audioUnit],

                                 ioActionFlags,

                                 inTimeStamp,

                                 inBusNumber,

                                 inNumberFrames,

                                 bufferList);

        return noErr;

    }

    static OSStatus playbackCallback(void *inRefCon,

                                     AudioUnitRenderActionFlags *ioActionFlags,

                                     const AudioTimeStamp *inTimeStamp,

                                     UInt32 inBusNumber,

                                     UInt32 inNumberFrames,

                                     AudioBufferList *ioData) {

        return noErr;

    }

    相关文章

      网友评论

          本文标题:AudioUnit 基本用法

          本文链接:https://www.haomeiwen.com/subject/hrgbnxtx.html