首页 技术 正文
技术 2022年11月6日
0 收藏 692 点赞 1,034 浏览 6516 个字

原文链接: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

【原】AVAudio录制,播放 (解决真机播放音量太小)

参考链接: 1,http://code4app.com/ios/%E5%BD%95%E9%9F%B3%E5%92%8C%E6%92%AD%E6%94%BE/51ba821b6803fa6901000000

     2. http://stackoverflow.com/questions/18807157/how-do-i-route-audio-to-speaker-without-using-audiosessionsetproperty

本文属于原创,转载请注明,谢谢 http://www.cnblogs.com/A–G/p/4624526.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,110
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,584
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,431
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,202
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,837
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,920