简单研究利用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- 简单研究利用AV Foundation框架实现模仿微信语音录制和播放功能
- IOS 基于AV Foundation框架开发简单音乐播放器
- IOS 基于AV Foundation框架开发简单音乐播放器
- Android模仿微信语音聊天功能
- AV Foundation - 录制音频
- Java简单实现视频录制播放功能
- AV Foundation - 播放音乐
- Android语音录制和播放
- AudioRecord实现"助听器" ,录制和播放功能
- Android模仿微信语音聊天功能-IT蓝豹
- Android模仿微信语音聊天功能-IT蓝豹
- OC模仿微信发送语音按钮功能
- AV Foundation 框架图
- iOS 语音录制及播放,类似微信手势脱出取消,拖回继续录制。
- 源码推荐(3.27):模仿微信的录音和播放功能,自定义的密码键盘
- 使用AV Foundation框架来实现实时滤镜
- android实现微信语音功能
- 仿微信语音消息的录制和播放
- 黑马程序员——Java基础——其他对象(Calendar)
- java form entity DTO
- Symmetric Tree
- androidTypedValue.applyDimension()的作用
- C# 属性上方的标识符说明
- 简单研究利用AV Foundation框架实现模仿微信语音录制和播放功能
- php实现JS的encodeURI和decodeURI
- Spring 3之MVC & Security简单整合开发(一)
- Unreal Engine 4切换默认Camera实现
- VNC 远程连接 CentOS桌面
- 传带有多个参数的URl串,&的编码问题
- 避免 DropDownList 指定無效的 SelectedValue
- ReflectionClass 类
- 浏览器状态码汇总