AVAudioRecorder(ios7)
返回目录
1. 关于录音和Audio Session Categories
如 果AVAudioRecorder的averagePowerForChannel和peakPowerForChannel方法总是返回-160的话, 那么很有可能是当前的Audio Session Categories不允许进行音频输入(也就是麦克风输入)。 如:AVAudioSessionCategorySoloAmbient/kAudioSessionCategory_SoloAmbientSound, 或者AVAudioSessionCategoryPlayback/kAudioSessionCategory_MediaPlayback。
如 果这样的话,我们需要把当前Audio Session Categories设置成 AVAudioSessionCategoryRecord/kAudioSessionCategory_RecordAudio,或者 AVAudioSessionCategoryPlayAndRecord/kAudioSessionCategory_PlayAndRecord。
可以使用两套API,一种是AVFoundation Framework中的API。如下:
NSError *setCategoryError = nil;
BOOL success = [[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryRecord
//或者AVAudioSessionCategoryPlayAndRecord
error: &setCategoryError];
另一种是使用AudioToolbox Framework,它是基于C的API,如下:
//或者使用kAudioSessionCategory_PlayAndRecord
UInt32 sessionCategory = kAudioSessionCategory_RecordAudio;
OSStatus result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
返回目录
2. 分贝数据的处理
根 据Apple文档,AVAudioRecorder的averagePowerForChannel和peakPowerForChannel方法返回的 是分贝数据,数值在-160 - 0之间(可能会返回大于0的值如果超出了极限)。在实际测试中,比如我在办公室(不算吵也不算特别安静的环境下)我测试 averagePowerForChannel的返回值平均在-70左右徘徊。
有很多方法可以把这个原始的分贝数据转化成更可读或者更可用的形式。如Apple SpeakHere Sample。
为了显示和现实生活中更贴切的分贝数据,我用了这种方法。
使用上述方法的参考代码:
//用于监控AVAudioRecorder数据的Timer回调方法。
//注意设置AVAudioRecorder的meteringEnabled属性为YES。
//recorder变量是AVAudioRecorder对象。
//http://stackoverflow.com/questions/9247255/am-i-doing-the-right-thing-to-convert-decibel-from-120-0-to-0-120/16192481#16192481
- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];
float level; // The linear 0.0 .. 1.0 value we need.
float minDecibels = -80.0f; // Or use -60dB, which I measured in a silent room.
float decibels = [recorder averagePowerForChannel:0];
if (decibels < minDecibels)
{
level = 0.0f;
}
else if (decibels >= 0.0f)
{
level = 1.0f;
}
else
{
float root = 2.0f;
float minAmp = powf(10.0f, 0.05f * minDecibels);
float inverseAmpRange = 1.0f / (1.0f - minAmp);
float amp = powf(10.0f, 0.05f * decibels);
float adjAmp = (amp - minAmp) * inverseAmpRange;
level = powf(adjAmp, 1.0f / root);
}
NSLog(@"平均值 %f", level * 120);
}
返回目录
3. iOS 7中默认配置的变化
在iOS 6中,AVAudioRecorder的默认配置(通过其settings属性)是:
{
AVFormatIDKey = 1819304813;
AVLinearPCMBitDepthKey = 16;
AVLinearPCMIsBigEndianKey = 0;
AVLinearPCMIsFloatKey = 0;
AVLinearPCMIsNonInterleaved = 0;
AVNumberOfChannelsKey = 1;
AVSampleRateKey = 44100;
}
而在iOS 7中,默认配置是:
{
AVFormatIDKey = 1819304813;
AVLinearPCMBitDepthKey = 16;
AVLinearPCMIsBigEndianKey = 0;
AVLinearPCMIsFloatKey = 0;
AVLinearPCMIsNonInterleaved = 0;
AVNumberOfChannelsKey = 2;
AVSampleRateKey = 44100;
}
变化是AVNumberOfChannelsKey从1变成了2,也就是支持两个音道的录制,显然一个麦克风不需要,最好把AVNumberOfChannelsKey设置成1。
关于AVAudioRecorder的配置项,可以参考这个帖子。
转载于:https://www.cnblogs.com/li-baibo/p/3376661.html
AVAudioRecorder(ios7)相关推荐
- iOS7的界面上移问题
第一种方法:修改BaseSDK XCode5的默认BaseSDK是iOS7,所以要修改成工程文件创建时的BaseSDK.但是XCode5中默认只带有iOS7的SDK,所以要想能做到更改SDK,我们就要 ...
- 【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(上)
简介: 本文翻译自<iOS7 by Tutorials>一书的第一章"Designing for iOS 7",主要从程序员角度介绍了iOS7的新设计理念,堪称神作!本 ...
- 使用vue2.0 vue-router vuex 模拟ios7操作
其实你也可以,甚至做得更好... 首先看一下效果:用vue2.0实现SPA:模拟ios7操作 与 通讯录实现 github地址是:https://github.com/QRL909109/ios7 如 ...
- 【从零学习openCV】IOS7下的人脸检測
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- XenMobile 8.7对iOS7.1 企业级MDM管理功能带来哪些扩展?
在最新发布的iOS版本中,苹果继续推进企业迄需的管理功能.iOS7引入了一套令CIO砰然心动的企业级管理功能.让我们快速浏览一下. 善用这些功能,能创建一些有吸引力的企业用例.CIO们,设想一下: 1 ...
- 【UIKit】解决iOS7状态栏问题
#pragma mark - 解决iOS7状态栏问题 - (void)viewWillAppear:(BOOL)animated {// 注意点:自定义布局方法必须放在隐藏或显示导航栏(如果有的话)这 ...
- [置顶] 【IOS】IOS7 UI适配
昨天下了把手机升级成了IOS7 正式版,然后下了最新的xocde5. 试着编译了一下刚刚完成的几个应用,还好问题不大,半个小时的时间都适配好了,然后改了下几个新出现的warning.过几天等空了,要 ...
- iphone怎么变android,如何将安卓变ios7 将安卓变iphone的两种简单方法分享
第一种将安卓变ios7方法 如果你非常喜欢iOS 7的设计风格却又不愿意放弃Android系统带来的自由体验,或许让你的Android系统看起来像iOS 7是一个不错的选择.现在通过一些Android ...
- (0092)iOS开发AVAudioRecorder录制音频
AVAudioRecorder 获取音量 录音音量监测 https://www.jianshu.com/p/f4597bc61b3e AVAudio录制,播放 (解决真机播放音量太小) https:/ ...
- 为什么在iOS7中,UITableView顶部的UITableViewStyleGrouped样式具有额外的填充
本文翻译自:Why is there extra padding at the top of my UITableView with style UITableViewStyleGrouped in ...
最新文章
- TBtools - 超过一万人在使用的生信小工具
- App icon和启动图的尺寸需求(没有iPad)
- Android SDK目录结构
- .net EF监控 MiniProfiler
- windows ffmpeg 的安装
- Linux查看Bios信息
- python 调用vba 参数 保存表格_Jupyter Notebooks嵌入Excel并使用Python替代VBA宏
- php类似微信聊天框,仿微信聊天功能
- mysql 表迁移 并筛选_使用perl实现拆分数据表(mysql)并迁移数据实例
- 几个清华和交大学霸的公众号,值得学习
- linux内核安全模块,对Linux内核的修改 - Linux 安全模块(LSM)简介_Linux安全_Linux公社-Linux系统门户网站...
- B站批量下载工具——下载姬
- 高斯函数与高斯核函数
- ISweek工采网·工采电子参展OFweek维科网 2021全球数字经济产业大会圆满落幕
- 业绩爆发,押注“泛半导体”,TCL押对了吗?
- (大集合)AI工具和用法汇总—集合的集合
- Cadence OrCAD Capture 绘制总线的方法
- 基于导向滤波的暗通道先验去雾算法(Python,可直接运行)
- 数据库中候选键的确定
- day27 MySQL 表的约束与数据库设计