iOS 音频采集 AudioBufferList转CMSampleBufferRef

原创 2016年03月12日 13:57:10

@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, 48000), 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 = 48000;

    

    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);


    }

    

}



相关文章推荐

Ios 实现麦克风捕获和AAC编码

在Ios中,实现打开和捕获麦克风大多是用的AVCaptureSession这个组件来实现的,它可以不仅可以实现音频捕获,还可以实现视频的捕获。本文将主要实现麦克风音频的捕获和编码。 针对打开麦克风和...

ios多音频混合

ios上音频文件合成有多种方法,一是使用AVAssetExportSession结合AVMutableComposition,二是使用AVAssetReader和AVAssetWriter. 三是转换...

关于audio各结构说明摘录

AudioStreamBasicDescription: In audio data a frame is one sample across all channels. In non-inte...

android audio buffer 分析

我们知道,播放audio的时候,音频数据是从AT传送到AF的,然后AF中的audiomixer来读取PCM数据做mix 下面对这个流程做大体分析。 首先,分析一下AT和AF之间传递数据使用的内存是...

1小时学会:最简单的iOS直播推流(五)yuv、pcm数据的介绍和获取

最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! ...

avsubtitleWriter demo解析(二):创建CMSampleBufferRef

这里有必要要阐述下字幕wen'ji
  • Mamong
  • Mamong
  • 2014年04月13日 07:57
  • 7043

CMSampleBufferRef与byte*互相转换(audio)

byte*转CMSampleBufferRef -(AudioStreamBasicDescription) getAudioFormat{     AudioStreamBasicDes...

ios视频和音频采集

ios视频和音频采集以及预览 本文将说明如何用ios做视频和音频的采集,以及预览,预览采用的是系统自带的AVCaptureVideoPreviewLayer和UIView,视频采集用AVCaptur...

AVFoundation视频播放、存储原理分析与使用

在前面的章节,我们分析了Camera拍照录制,获取音视频流的基本过程。以及AVAsset保存音频文件。这里我们还要再来了解下AVAsset以及利用AVFoundation读取音视频流处理的过程。看起来...

iOS实现麦克风捕获和AAC编码

转载地址:http://blog.csdn.net/shenyi0106/article/details/47004039 在Ios中,实现打开和捕获麦克风大多是用的AVCaptur...
  • dssxk
  • dssxk
  • 2015年12月16日 14:18
  • 1960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 音频采集 AudioBufferList转CMSampleBufferRef
举报原因:
原因补充:

(最多只允许输入30个字)