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这个组件来实现的,它可以不仅可以实现音频捕获,还可以实现视频的捕获。本文将主要实现麦克风音频的捕获和编码。 针对打开麦克风和...
  • shenyi0106
  • shenyi0106
  • 2015年07月22日 15:22
  • 5468

iOS音视频实时采集硬件编码

iOS音视频实时采集硬件编码(H264+AAC)做 iOS开发已经好几年了,从来没写博客的习惯,既然第一次写,那就写点有意义的东西.最近在做音视频方面的东西,发现国内硬编的资料特别少,去网上搜全是软编...
  • u011518723
  • u011518723
  • 2015年10月19日 12:15
  • 6901

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

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

Windows上的音频采集技术(转)

转自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/  前一段时间接到一个任务,需要采集到声卡的输出信号,以便与...
  • wishfly
  • wishfly
  • 2015年10月23日 01:16
  • 946

android音频采集,MediaCodec实时PCM转AAC

android音频采集,MediaCodec实时PCM转AAC,网上很多都不是实时采集转换的。希望对有需要的朋友带来一些帮助 先看看关键的转换工具类: package com....
  • KokJuis
  • KokJuis
  • 2017年05月27日 15:36
  • 1681

底层音频采集与回放

  • 2006年03月16日 00:00
  • 10KB
  • 下载

音频采集回放源代码汇总

  • 2012年06月26日 22:16
  • 15.24MB
  • 下载

TMS320VC5509 音频采集,CPLD显示 电路图

  • 2017年03月20日 10:21
  • 260KB
  • 下载

一种基于TMS320VC5509的音频采集与回放系统

  • 2014年03月21日 18:29
  • 961KB
  • 下载

基于labview的音频采集与存储

  • 2014年02月25日 11:04
  • 33KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 音频采集 AudioBufferList转CMSampleBufferRef
举报原因:
原因补充:

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