简单研究利用AV Foundation框架实现模仿微信语音录制和播放功能

来源:互联网 发布:.net域名崛起 编辑:程序博客网 时间:2024/05/19 02:06

参考博客:(http://blog.csdn.net/rhljiayou/article/details/15339335)

上图:

 

在CSDN看到一篇关于模仿微信语音录制和播放功能实现的博客,由于现在语音在App中使用的相当频繁,在微信、QQ等社交软件中语音功能几乎是必备的,酷狗音乐、唱吧等音乐软件也都有音频录制和播放的需要,所以我在网上又搜集了一些相关的Demo查看,简单学习一下别人是如何使用AVFoundation这个框架处理录音和播放音频的,下面我就总结一下自己所学到的知识,如有理解错误或分析不到位还希望能得到各位大神的指点纠正。

ios为我们提供了处理音频的基础技术:核心音频(core Audio)

   有5个框架:1.CoreAudio.framework

               2.AudioToolbox.framework

               3.AudioUnit.framework

               4.AVFoundation.framework

               5.OpenAL.framework

AV Foundation库文件共包括如下类:


新建项目工程,首先导入AV Foundation框架,此处使用ARC=YES,导入相关图片文件,创建ViewController,带上xib文件,把AppDelegate的rootViewController交给ViewController,通过ib文件加载视图。在ViewController中导入<AVFoundation/AVFoundation.h>库,定义如下变量和实例方法:

{

   IBOutlet UIImageView *soundLodingImageView;//从IB链接的一个UIImageView

   IBOutlet UIButton *playBtn;//从IB链接的button

   AVAudioRecorder *recorder; //录音器

   AVAudioPlayer *player; //播放器

   NSDictionary *recorderSettingsDict;//播放器的配置添加到一个字典里

   NSTimer *timer; //定时器

   NSMutableArray *volumImages; //图片组

   double lowPassResults;//创建一个double类型的lowPassResults获取最低分贝值

   NSString *playName; //录音名字

}

- (IBAction)downAction:(id)sender;//点击开始录音执行的方法

- (IBAction)upAction:(id)sender;//松手录音结束的方法

- (IBAction)playAction:(id)sender;//播放音频

 

实现Demo中AV Foundation的方法:【此处使用的时AVAudioSession类】

1、AVAudioSession 直接继承与NSObjectà AVAudioSession : NSObject;        

2、创建会话session,调用AVAudioSession的类方法+ (id)sharedInstance;返回一个单例实例

3、- (BOOL)setCategory:(NSString *)category error:(NSError **)outError;

AVAudioSession中设置音频类型的实例方法,返回一个BOOL类型;

setCategory需要返回一个NSString类型的分类属性的值,调用失败返回error:

AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord,表示用于录音和播放;(一般选这个,录制和播放都可以使用)

AVF_EXPORT NSString *constAVAudioSessionCategoryRecord,表示录制音频;

还有几个不常用的类别:添加背景声音如雨、汽车发动机噪声等混合与其他音乐,使用背景音乐类型并停止其他音乐播放(这个类别在录制和播放语音时会使用,前提条件是存在音乐播放软件的情况下),使用硬件编解码器或信号处理器。

4、//调用AVFoundation框架的setActive方法这是会话活动:

- (BOOL)setActive:(BOOL)activeerror:(NSError **)outError;返回一个BOOL类型

5、设置录音器和播放器

recorderSettingsDict =[[NSDictionary alloc]initWithObjectsAndKeys:

   [NSNumbernumberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,

   [NSNumbernumberWithInt:1000.0],AVSampleRateKey,

   [NSNumbernumberWithInt:2],AVNumberOfChannelsKey,

   [NSNumbernumberWithInt:8],AVLinearPCMBitDepthKey,

   [NSNumbernumberWithBool:NO],AVLinearPCMIsBigEndianKey,

   [NSNumbernumberWithBool:NO],AVLinearPCMIsFloatKey,nil];

     /*录音设置,初始化播放器,

    AVFormatIDKey->格式的ID,格式使用了CoreAudio库中的CoreAudioTypes类的一组枚举方法,例子中使用的AAC的格式这里需要注意iOS常用的几种音频格式,详见下文【iOS系统支持音频格式及编码要求】和【CoreAudioTypes类中音频格式枚举值】

    AVSampleRateKey->音频采样率,

    AVNumberOfChannelsKey->关键渠道,通道,

    AVLinearPCMBitDepthKey->采样位数,默认为16,

    AVLinearPCMIsBigEndianKey->大端还是小端,是内存的组织方式

AVLinearPCMIsFloatKey,nil]->采样信号是否是浮点数NO*/

具体关于音频格式和ACC等格式编码转解码的内容可进入:http://www.360doc.com/content/14/0313/15/9075092_360274297.shtml查看具体分析

-----一切就绪,开始设置点击录音,松开停止并保存音频,点击播放功能啦----

6、点击按钮触发录音功能,开启记录方法,则初始化录音器,定义捕获音频的存储路径并设置播放器,初始化AV Foundation下的AVAudioRecorder类,直接继承自NSObject;

初始化调用-(id)initWithURL:(NSURL *)url settings:(NSDictionary *)settings error:(NSError**)outError;实例方法,传一个url进去,设置记录文件的扩展名,如果存在则覆盖;

7、录音器初始化成功,开启计量器,调用AVFoundation框架的prepareToRecord方法创建文件,准备记录,该方法会自动记录[recorder prepareToRecord];启动AVFoundation的记录或回复文件方法[recorderrecord],开启定时器,定时器启动后调用levelTimer方法。

8、松开后结束录音,直接使用[recorder stop],此时注意要把recorder设置为nil,由于使用了ARC,是系统自动管理内存,所以如果recorder停止调用后将不再指向内存区域,为了防止偶然调用到野指针,安全起见还是需要把值设为nil,指向一片不存在的内存。录音结束的同时调用定时器也停止,同样定时器也要把指针设为nil。

9、点击播放已经录制好的音频,在初始化player播放器时使用AV Foundation框架下的AVAudioPlayer类,读取存储在本地的录音格式文件,点击执行[player play];

----基本的按钮功能也都写好了,接下来是定时器调用的levelTimer方法设置分贝和不同分贝显示的图片----

10、peakPowerForChannel 峰值功率通道,返回峰值功率分贝对于一个给定的通道,AVFoundation的方法。

   //call to refresh meter values刷新平均和峰值功率,此计数是以对数刻度计量的,lowPassResults是最低值,初始值为0 ,

   [recorder updateMeters];//录音器调用刷新记值的方法

   const double ALPHA = 0.05;//alpha值在物理分贝表示中+0.05为最小分贝数,-0.05为最大分贝数,+80为最小分贝数,-80为最大分贝数

       doublepeakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));

       lowPassResults= ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;

以上两套算法公式尚不明白其运算过程和使用方法,暂时只要记住怎么用吧,lowPassResults是最小分贝值,通过计算得到一个最小分贝值来判断图片的显示;

11、7.0新增方法,判断是否允许使用麦克风requestRecordPermission

-(BOOL)canRecord

{

   __block BOOL bCanRecord = YES;

   if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"]!= NSOrderedAscending)

    {

    //- (BOOL)respondsToSelector:(SEL)Selector;在NSObject和NSProxy中都存在,在NSProxy中是一个类方法,此处使用的是它的类方法

    AVAudioSession*audioSession = [AVAudioSession sharedInstance];     if([audioSessionrespondsToSelector:@selector(requestRecordPermission:)]){

    //performSelector选择执行器,requestRecordPermission:会话类别等。例子:AV音频会话类别记录,AV音频会话类别和记录,AVFoundation的一个实例方法。

[audioSession performSelector:@selector(requestRecordPermission:)withObject:^(BOOL granted) {

                if (granted) {

                    bCanRecord = YES;

                }

                else {

                    bCanRecord = NO;

   //返回主线程执行UI操作,此处可以不使用回调,安全起见回调主函数运行

   dispatch_async(dispatch_get_main_queue(),^{

   [[[UIAlertViewalloc] initWithTitle:nil

   message:@"app需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"

   delegate:nil

   cancelButtonTitle:@"关闭"

  otherButtonTitles:nil] show];

                    });

                }

           }];

       }

    }

   return bCanRecord;

}

 

【注】Demo的url设置可以决定是在真机运行还是模拟器运行。

[[AVAudioRecorder alloc] initWithURL:[NSURLfileURLWithPath:playName] settings:recorderSettingsDict error:&error];

如果要在模拟器运行,需要将NSURL的获取方式改为fileURLWithPath,若在真机运行则改为URLWithPath。

 

【iOS系统支持音频格式及编码要求:】

AAC (16 至 320 Kbps)、Protected AAC (来自 iTunes Store)、MP3 (16 至 320 Kbps)、MP3 VBR、Audible (formats 2、3、4)、Apple Lossless、AIFF 及 WAV

The audio technologies in iOS support thefollowing audio formats:

•     AAC

•     Apple Lossless (ALAC)

•     A-law

•     IMA/ADPCM (IMA4)

•     Linear PCM

•     µ-law

•     DVI/Intel IMA ADPCM

•     Microsoft GSM 6.10

•     AES3-2003

 

【CoreAudioTypes类中音频格式枚举值:】

     kAudioFormatLinearPCM               = 'lpcm',

   kAudioFormatAC3                    = 'ac-3',

   kAudioFormat60958AC3               = 'cac3',

   kAudioFormatAppleIMA4              = 'ima4',

   kAudioFormatMPEG4AAC               = 'aac ',

   kAudioFormatMPEG4CELP              = 'celp',

   kAudioFormatMPEG4HVXC              = 'hvxc',

   kAudioFormatMPEG4TwinVQ            = 'twvq',

   kAudioFormatMACE3                  = 'MAC3',

   kAudioFormatMACE6                  = 'MAC6',

   kAudioFormatULaw                    = 'ulaw',

   kAudioFormatALaw                   = 'alaw',

   kAudioFormatQDesign                = 'QDMC',

   kAudioFormatQDesign2               = 'QDM2',

   kAudioFormatQUALCOMM               = 'Qclp',

   kAudioFormatMPEGLayer1              = '.mp1',

   kAudioFormatMPEGLayer2             = '.mp2',

   kAudioFormatMPEGLayer3             = '.mp3',

   kAudioFormatTimeCode               = 'time',

   kAudioFormatMIDIStream             = 'midi',

   kAudioFormatParameterValueStream    = 'apvs',

   kAudioFormatAppleLossless          = 'alac',

   kAudioFormatMPEG4AAC_HE            = 'aach',

   kAudioFormatMPEG4AAC_LD            = 'aacl',

   kAudioFormatMPEG4AAC_ELD           = 'aace',

   kAudioFormatMPEG4AAC_ELD_SBR       = 'aacf',

   kAudioFormatMPEG4AAC_ELD_V2        = 'aacg',   

   kAudioFormatMPEG4AAC_HE_V2         = 'aacp',

   kAudioFormatMPEG4AAC_Spatial       = 'aacs',

   kAudioFormatAMR                    = 'samr',

   kAudioFormatAudible                = 'AUDB',

   kAudioFormatiLBC                   = 'ilbc',

   kAudioFormatDVIIntelIMA            = 0x6D730011,

   kAudioFormatMicrosoftGSM           = 0x6D730031,

    kAudioFormatAES3
0 0
原创粉丝点击