【原】AVAudio录制,播放 (解决真机播放音量太小)
原文链接:http://www.cnblogs.com/A--G/p/4624526.html
最近学习AVFoundation里的audio操作,最基本的录制和播放,参考了一个Code4pp的 一个 demo后,发现写的不错,但是里面有一些问题,1,由于没有添加控制输入输出流的AVAudioSession,真机播放无法录音;2.真机播放的音量很小;
下面是源代码:
//
// ViewController.h
// AudioRecorder
//
// Created by MZN on 15-7-1.
// Copyright (c) 2015年 MZN. All rights reserved.
// #import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h> @interface ViewController : UIViewController<AVAudioRecorderDelegate>
{
AVAudioRecorder *recorder;
NSTimer *timer;
NSURL *urlPlay; }
@property (retain, nonatomic) IBOutlet UIButton *btn;
@property (retain, nonatomic) IBOutlet UIImageView *imageView;
@property (retain, nonatomic) IBOutlet UIButton *playBtn;
@property (retain, nonatomic) AVAudioPlayer *avPlay; @end
//
// ViewController.m
// AudioRecorder
//
// Created by MZN on 15-7-1.
// Copyright (c) 2014年 MZN. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController
@synthesize btn;
@synthesize imageView = _imageView;
@synthesize playBtn = _playBtn;
@synthesize avPlay = _avPlay; - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self audio];
[self.btn addTarget:self action:@selector(btnDown:) forControlEvents:UIControlEventTouchDown];
[self.btn addTarget:self action:@selector(btnUp:) forControlEvents:UIControlEventTouchUpInside];
[self.btn addTarget:self action:@selector(btnDragUp:) forControlEvents:UIControlEventTouchDragExit];
[self.playBtn addTarget:self action:@selector(playRecordSound:) forControlEvents:UIControlEventTouchDown]; } - (IBAction)playRecordSound:(id)sender
{
if (self.avPlay.playing) {
[self.avPlay stop];
return;
}
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:urlPlay error:nil];
self.avPlay = player;
[player release];
[self.avPlay play];
} - (IBAction)btnDown:(id)sender
{ //创建录音文件,准备录音
if ([recorder prepareToRecord]) {
//开始
[recorder record];
} //设置定时检测
timer = [NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(detectionVoice) userInfo:nil repeats:YES];
} - (IBAction)btnUp:(id)sender
{
double cTime = recorder.currentTime;
if (cTime > ) {//如果录制时间<2 不发送
NSLog(@"发出去");
}else {
//删除记录的文件
[recorder deleteRecording];
//删除存储的
}
[recorder stop];
[timer invalidate];
} - (IBAction)btnDragUp:(id)sender
{
//删除录制文件
[recorder deleteRecording];
[recorder stop];
[timer invalidate]; NSLog(@"取消发送");
} - (void)audio
{
//录音设置
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
//设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
//设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
[recordSetting setValue:[NSNumber numberWithFloat:] forKey:AVSampleRateKey];
//录音通道数 1 或 2
[recordSetting setValue:[NSNumber numberWithInt:] forKey:AVNumberOfChannelsKey];
//线性采样位数 8、16、24、32
[recordSetting setValue:[NSNumber numberWithInt:] forKey:AVLinearPCMBitDepthKey];
//录音的质量
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
//是否使用浮点数采样
[recordSetting setValue:@(YES) forKey:AVLinearPCMIsFloatKey]; NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/lll.aac", strUrl]];
urlPlay = url; NSError *error;
//初始化
recorder = [[AVAudioRecorder alloc]initWithURL:url settings:recordSetting error:&error];
//开启音量检测
recorder.meteringEnabled = YES;
recorder.delegate = self;
} - (void)detectionVoice
{
[recorder updateMeters];//刷新音量数据
//获取音量的平均值 [recorder averagePowerForChannel:0];
//音量的最大值 [recorder peakPowerForChannel:0]; double lowPassResults = pow(, (0.05 * [recorder peakPowerForChannel:]));
NSLog(@"%lf",lowPassResults);
//最大50 0
//图片 小-》大
if (<lowPassResults<=0.06) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_01.png"]];
}else if (0.06<lowPassResults<=0.13) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_02.png"]];
}else if (0.13<lowPassResults<=0.20) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_03.png"]];
}else if (0.20<lowPassResults<=0.27) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_04.png"]];
}else if (0.27<lowPassResults<=0.34) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_05.png"]];
}else if (0.34<lowPassResults<=0.41) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_06.png"]];
}else if (0.41<lowPassResults<=0.48) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_07.png"]];
}else if (0.48<lowPassResults<=0.55) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_08.png"]];
}else if (0.55<lowPassResults<=0.62) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_09.png"]];
}else if (0.62<lowPassResults<=0.69) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_10.png"]];
}else if (0.69<lowPassResults<=0.76) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_11.png"]];
}else if (0.76<lowPassResults<=0.83) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_12.png"]];
}else if (0.83<lowPassResults<=0.9) {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_13.png"]];
}else {
[self.imageView setImage:[UIImage imageNamed:@"record_animate_14.png"]];
}
} - (void) updateImage
{
[self.imageView setImage:[UIImage imageNamed:@"record_animate_01.png"]];
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
一、问题1:添加AVAudioSession, 这里由于录制和play都需要,所以设置Category为AVAudioSessionCategoryPlayAndRecord:
NSError *categoryError = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&categoryError];
[audioSession setActive:YES error:&categoryError];
二、问题2:真机播放音量太小,有人说设置AudioSession属性里把sizeof设成1可行:
// UInt32 doChangeDefault = 1;
// AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefault), &doChangeDefault);
使用后的确可以,但是ios7.0之后,AudioSessionSetProperty已经被弃用了,于是乎
~keep looking for~~~
____________ 15分钟之后_______________
在stackoverflow上,一位朋友说audioSession的属性基本迁移到AVFoundation里了,建议我们多使用AVFoundation里的API。
NSError *audioError = nil;
BOOL success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&audioError];
if(!success)
{
NSLog(@"error doing outputaudioportoverride - %@", [audioError localizedDescription]);
}
初步实现了录制和播放功能,进一步的研究正在进行ing~~~~
需要修改过demo的朋友可以从这里下载:http://files.cnblogs.com/files/A--G/AudioRecorder%E6%94%B9%E8%BF%9B%E6%92%AD%E6%94%BE%E9%9F%B3%E9%87%8F.zip
参考链接: 1,http://code4app.com/ios/%E5%BD%95%E9%9F%B3%E5%92%8C%E6%92%AD%E6%94%BE/51ba821b6803fa6901000000
本文属于原创,转载请注明,谢谢 http://www.cnblogs.com/A--G/p/4624526.html
【原】AVAudio录制,播放 (解决真机播放音量太小)的更多相关文章
- python绘图中使用公式时,解决\frac{}{}出来的字体太小的问题
在用matplotlib绘图需要在图片中加入公式时,一般要用 text 或 annotate函数,并结合latex语法 '$...$'. 对于分数,如果直接使用\frac{}{},会造成分子分母上的字 ...
- github视频录制播放相关功能-参考
lookingstars/JZVideoDemo 视频播放器 Updated on 11 Aug Objective-C 15 10 caoguoqing/VideoEditDemo iOS vi ...
- Android开发笔记——视频录制播放常见问题
本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...
- MVC4升级MVC5导致原项目出错的解决方法
原文:MVC4升级MVC5导致原项目出错的解决方法 出现安全透明方法"WebMatrix.WebData.PreApplicationStartCode.Start()"尝试访问安 ...
- 移动端实现HTML5 mp3录音踩坑指南:系统播放音量变小、一些机型录音断断续续 之 MediaRecorder和AudioWorklet的终极对决
目录 H5录音见坑填坑 采用MediaRecorder采集音频 音频格式:WebM和PCM 从WebM封装容器中提取PCM数据 录音的兼容性 困扰已久的H5录音时系统播放音量变小的问题 H5录音见坑填 ...
- 解决www.github.com访问太慢的问题
解决www.github.com访问太慢的问题 使用www.github.com的过程中,有时候打开会特别的慢,原因github.com的域名被一堵伟大的墙挡在了外面.但是我们可以通过修改本机的hos ...
- Eclipse 3.7(代号Indigo) 中文字体太小解决办法(转)
升级到3.7Eclipse最直观的反映就是,中文怎么那么小啊---- 相当不方便. 其实这是Eclipse的默认字体换了,以前的一直是Courier New,现在修改字体也找不到了,算了不找了. 这次 ...
- Html中DIV成为超级链接,解决在360浏览器+IE9显示小手图标的兼容性!
Html中DIV成为超级链接,解决在360浏览器+IE9显示小手图标的兼容性! <div style="cursor:pointer;" onclick="sele ...
- 关于 pyspider Web预览界面太小的解决方法
本人最近在学习pyspider时,遇到Web预览界面太小而无法很好的进行开发,于是在网上搜索解决方法. 准备: css代码: body{margin:;padding:;height:%;overfl ...
随机推荐
- sicp第1章
牛顿迭代法求平方: (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) ...
- bzoj3709
首先明显会想到贪心对于那些怪物回血比耗血多的,我们显然应该先打耗血少的那些回血比耗血多的怎么办呢?由于不管怎么打(假设体力负数了还能打),最终体力是一定,我们从最终体力倒推,相当于先吃药掉血,打怪物回 ...
- Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞
漏洞名称: Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞 CNNVD编号: CNNVD-201307-488 发布时间: 201 ...
- -_-#【JS】isFinite
/** * isFinite(number) * 检查是否是无穷大 * 如果 number 是有限数字(或可转换为有限数字),那么返回 true * 如果 number 是 NaN(非数字),或者是正 ...
- Eclipse ARM IDE 开发环境
一.Eclipse Eclipse的本身只是一个框架平台,但是众多插件的支持,使得Eclipse拥有较好的灵活性. 二.CDT CDT是Eclipse用于扩展Eclipse支持C/C++开发的插件. ...
- 动态树(LCT):HDU 4010 Query on The Trees
Query on The Trees Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Othe ...
- 【线段树】HDU 5493 Queue (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5493 题目大意: N个人,每个人有一个唯一的高度h,还有一个排名r,表示它前面或后面比它高的人的个数 ...
- 【模拟】Codeforces 710B Optimal Point on a Line
题目链接: http://codeforces.com/problemset/problem/710/B 题目大意: 给N个点的坐标,在X轴上找到最靠左的点使得这个点到N个点距离之和最小. 题目思路: ...
- 数学概念——I - 数论,线性方程
I - 数论,线性方程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- hdu 4608 I-number 大整数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4608 #include <cstdio> #include <cmath> # ...