【原】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 ...
随机推荐
- js/bat批处理调用谷歌浏览器chrome批量打开网页测试web性能
批处理批量打开网页 其实用java就可以搞定,但是这么一个轻巧的测试,js或者bat批处理去一次性打开几百个网页测试一下页面没必要上java 两者的区别,js的话,只能打开多个浏览器实例,不方便查看效 ...
- Firebase能改变什么(对SaaS,BaaS,PaaS,IaaS的解释比较清楚)
作为Google Cloud对标Amazon AWS重要的一环,Firebase能改变什么? 雷锋网 2016-05-25 12:18:49 查看源网址 阅读数:12 按:本文作者刘之,野狗CEO.野 ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
- Linux Shell编程(2)——第一个shell程序
在最简单的情况下,脚本程序不过是存储在一个文件里的系统命令列表.这至少让你执行它 时不必重新按顺序键入相同功能的命令序列.一个清空/var/log目录下的日志文件的脚本 # Cleanup # 必须以 ...
- Qt入门(16)——组装窗口部件
这个例子显示了创建几个窗口部件并用信号和槽把它们连接起来,和如何处理重新定义大小事件. #include <qapplication.h> #include <qpushbutton ...
- 数学:UVAoj 11174 Stand in a Line
Problem J Stand in a Line Input: Standard Input Output: Standard Output All the people in the bytela ...
- 【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间 ...
- IIS6.0服务器搭建网站无法访问解决方法
IIS6.0服务器搭建网站无法访问解决方法 IIS6.0服务器搭建网站无法访问解决方法很多朋友在用IIS6架网站的时候遇到不少问题,而这些问题有些在过去的IIS5里面就遇到过,有些是新出来的, ...
- ArrayList 、Vector、 LinkList
public class TestList { public static void init(List list) { if(list!=null) ...
- [Locked] Smallest Rectangle Enclosing Black Pixels
An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...