iOS 音频采集 AudioBufferList转CMSampleBufferRef

 

@property (nonatomic, assign) AudioComponent              component;

 

@property (nonatomic, assign) AudioComponentInstance      componetInstance;

 

static OSStatus handleInputBuffer(void *inRefCon,

                                  AudioUnitRenderActionFlags *ioActionFlags,

                                  const AudioTimeStamp *inTimeStamp,

                                  UInt32 inBusNumber,

                                  UInt32 inNumberFrames,

                                  AudioBufferList *ioData) {

    @autoreleasepool {

        <CLassName> *ref = (__bridge <ClassName> *)inRefCon;

        

        AudioStreamBasicDescription asbd = [ref asbd];

        

        CMSampleBufferRef buff = NULL;

        

        CMFormatDescriptionRef format = NULL;

        

        OSStatus status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &asbd, 0, NULL, 0, NULL, NULL, &format);

        if (status) {

            return status;

        }

        CMSampleTimingInfo timing = { CMTimeMake(1, [AVAudioSession sharedInstance].sampleRate), kCMTimeZero, kCMTimeInvalid };

 

  

        status = CMSampleBufferCreate(kCFAllocatorDefault, NULL, false, NULL, NULL, format, (CMItemCount)inNumberFrames, 1, &timing, 0, NULL, &buff);

        

        if (status) { //失败

            return status;

        }

        

        AudioBuffer buffer;

        buffer.mData = NULL;

        buffer.mDataByteSize = 0;

        buffer.mNumberChannels = 2;

 

        AudioBufferList buffers;

        buffers.mNumberBuffers = 1;

        buffers.mBuffers[0] = buffer;

 

        status = AudioUnitRender(ref.componetInstance,

                                          ioActionFlags,

                                          inTimeStamp,

                                          inBusNumber,

                                          inNumberFrames,

                                          &buffers);

        if (status) {

            return status;

        }

        status = CMSampleBufferSetDataBufferFromAudioBufferList(buff, kCFAllocatorDefault, kCFAllocatorDefault, 0, &buffers);

        

        if (!status) {

        }

 

        return status;

    }

}

 

- (AudioStreamBasicDescription)asbd

{

    AudioStreamBasicDescription desc = {0};

    desc.mSampleRate = [AVAudioSession sharedInstance].sampleRate;

    

    desc.mFormatID = kAudioFormatLinearPCM;

    desc.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

    desc.mChannelsPerFrame = 2;

    desc.mFramesPerPacket = 1;

    desc.mBitsPerChannel = 16;

    desc.mBytesPerFrame = desc.mBitsPerChannel / 8 * desc.mChannelsPerFrame;

    desc.mBytesPerPacket = desc.mBytesPerFrame * desc.mFramesPerPacket;

    

    return desc;

}

 

 

- (void)initMicrophoneSource

{

    AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];

    if(status == AVAuthorizationStatusAuthorized){

        AVAudioSession *session = [AVAudioSession sharedInstance];

        

        NSError *error = nil;

        

        [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionAllowBluetooth error:nil];

        

        if (![session setActive:YES error:&error]) {

            NSString *log = @"Failed to set audio session active.";

            NSLog(@"%@", log);

            return ;

        }

        

        AudioComponentDescription acd;

        acd.componentType = kAudioUnitType_Output;

        acd.componentSubType = kAudioUnitSubType_RemoteIO;

        acd.componentManufacturer = kAudioUnitManufacturer_Apple;

        acd.componentFlags = 0;

        acd.componentFlagsMask = 0;

        

        self.component = AudioComponentFindNext(NULL, &acd);

        

        OSStatus status = noErr;

        status = AudioComponentInstanceNew(self.component, &_componetInstance);

        

        if (noErr != status) {

            NSString *log = @"Failed to new a audio component instance.";

            NSLog(@"%@", log);

            return ;

        }

        

        UInt32 flagOne = 1;

        

        AudioUnitSetProperty(self.componetInstance, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &flagOne, sizeof(flagOne));

        

        AudioStreamBasicDescription desc = [self asbd];

        

        AudioUnitSetProperty(self.componetInstance, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &desc, sizeof(desc));

        

        

        AURenderCallbackStruct cb;

        cb.inputProcRefCon = (__bridge void *)(self);

        cb.inputProc = handleInputBuffer;

        

        AudioUnitSetProperty(self.componetInstance, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 1, &cb, sizeof(cb));

        

        status = AudioUnitInitialize(self.componetInstance);

        

        if (noErr != status) {

            NSString *log = @"Failed to init audio unit.";

            NSLog(@"%@", log);

        }

        

        AudioOutputUnitStart(self.componetInstance);

 

    }

    

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值