录音的实现
2016-01-28 21:21
387 查看
//
// RecordViewController.m
// SunshineMusic
//
// Created by dllo on 16/1/14.
// Copyright © 2016年 G.Group. All rights reserved.
//
#import "RecordViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "BaseButton.h"
#import "BaseImageView.h"
#import <Masonry.h>
#import "MusicTool.h"
#define kRecordAudioFile @"myRecord.caf"
@interface
RecordViewController () <AVAudioRecorderDelegate>
@property (nonatomic,
retain) AVAudioRecorder *audioRecorder;
@property (nonatomic,
retain) NSTimer *timer;
@property (nonatomic,
retain) AVAudioPlayer *audioPlayer;
@property (retain,
nonatomic) BaseButton *start;
@property (retain,
nonatomic) BaseButton *pause;
@property (retain,
nonatomic) BaseButton *resume;
@property (retain,
nonatomic) BaseButton *stop;
@property (retain,
nonatomic) UIProgressView *progress;
@property (nonatomic,
retain) BaseImageView *imageV;
@end
@implementation RecordViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self
createSubViews];
[self
setAudioSession];
}
- (void)createSubViews
{
self.view.backgroundColor = [UIColor
whiteColor];
[self imageV];
[self
createButtons];
[self progress];
}
- (BaseImageView *)imageV
{
if (!_imageV) {
_imageV = [BaseImageView
new];
_imageV.image = [UIImage
imageNamed:@"formdetailback"];
[self.view
addSubview:_imageV];
[_imageV mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
}
return
_imageV;
}
- (void)createButtons
{
self.start = [BaseButton
new];
self.start.layer.masksToBounds =
YES;
[self.start
setTitle:@"开始"
forState:UIControlStateNormal];
self.start.layer.cornerRadius = 25;
[self.start
addTarget:self
action:@selector(start:)
forControlEvents:UIControlEventTouchUpInside];
self.start.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.start];
self.pause = [BaseButton
new];
[self.pause
setTitle:@"暂停"
forState:UIControlStateNormal];
self.pause.layer.masksToBounds =
YES;
self.pause.layer.cornerRadius = 25;
[self.pause
addTarget:self
action:@selector(pause:)
forControlEvents:UIControlEventTouchUpInside];
self.pause.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.pause];
self.resume = [BaseButton
new];
[self.resume
setTitle:@"重新"
forState:UIControlStateNormal];
self.resume.layer.masksToBounds =
YES;
self.resume.layer.cornerRadius = 25;
// [self.resume addTarget:self action:@selector(resume:) forControlEvents:UIControlEventTouchUpInside];
self.resume.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.resume];
self.stop = [BaseButton
new];
[self.stop
setTitle:@"结束"
forState:UIControlStateNormal];
self.stop.layer.masksToBounds =
YES;
self.stop.layer.cornerRadius = 25;
[self.stop
addTarget:self
action:@selector(stop:)
forControlEvents:UIControlEventTouchUpInside];
self.stop.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.stop];
[self.start mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view.mas_centerY).offset(-160);
make.centerY.equalTo(self.view.mas_bottom).offset(-150);
make.height.width.equalTo(@50);
}];
[self.pause mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.start).offset(-100);
make.centerY.equalTo(self.start);
make.width.height.equalTo(self.start);
}];
[self.resume mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.start).offset(100);
make.centerY.equalTo(self.start);
make.width.height.equalTo(self.start);
}];
[self.stop mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.resume).offset(100);
make.centerY.equalTo(self.start);
make.width.height.equalTo(self.start);
}];
}
- (UIProgressView *)progress
{
if (!_progress) {
_progress = [UIProgressView
new];
[self.view
addSubview:_progress];
[_progress mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view).offset(-30);
make.centerX.equalTo(self.view);
make.width.mas_equalTo(300);
make.height.mas_equalTo(5);
}];
}
return
_progress;
}
- (void)setAudioSession
{
AVAudioSession *session = [AVAudioSession
sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord
error:nil];
[session setActive:YES
error:nil];
}
- (NSURL *)getSavePath
{
NSString *urlStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)
lastObject];
urlStr = [urlStr stringByAppendingPathComponent:kRecordAudioFile];
NSURL *url = [NSURL
fileURLWithPath:urlStr];
NSLog(@"%@", url);
return url;
}
- (NSDictionary *)getAudioSetting
{
NSMutableDictionary *dicM = [NSMutableDictionary
dictionary];
//设置录音格式
[dicM setObject:@(kAudioFormatLinearPCM)
forKey:AVFormatIDKey];
//设置录音采样率 8000是电话采样率,对于一般录音已经足够了
[dicM setObject:@(8000)
forKey:AVSampleRateKey];
//设置通道这里采用单声道
[dicM setObject:@(1)
forKey:AVNumberOfChannelsKey];
//每个采样点位数,
分为8, 16, 24, 32
[dicM setObject:@(8)
forKey:AVLinearPCMBitDepthKey];
//是否使用浮点数采样
[dicM setObject:@(YES)
forKey:AVLinearPCMIsFloatKey];
return dicM;
}
- (AVAudioRecorder *)audioRecorder
{
if (!_audioRecorder) {
NSURL *url = [self
getSavePath];
//创建录音格式设置
NSDictionary *setting = [self
getAudioSetting];
//创建录音机
NSError *error =
nil;
_audioRecorder = [[AVAudioRecorder
alloc] initWithURL:url
settings:setting error:&error];
_audioRecorder.delegate =
self;
_audioRecorder.meteringEnabled =
YES;//如果要监控声波则必须设置为yes
if (error) {
NSLog(@"创建录音机发生错误");
}
}
return
_audioRecorder;
}
//创建播放器
- (AVAudioPlayer *)audioPlayer
{
if (!_audioPlayer) {
NSURL *url=[self
getSavePath];
NSError *error=nil;
NSString *s = [NSString
stringWithContentsOfURL:url encoding:NSUTF8StringEncoding
error:nil];
NSLog(@"______%@", s);
_audioPlayer=[[AVAudioPlayer
alloc]initWithContentsOfURL:url
error:&error];
_audioPlayer.numberOfLoops = 0;
[_audioPlayer
prepareToPlay];
if (error) {
NSLog(@"创建播放器过程中发生错误,错误信息:%@",error.localizedDescription);
return
nil;
}
}
return
_audioPlayer;
}
- (NSTimer *)timer
{
if (!_timer) {
_timer = [NSTimer
scheduledTimerWithTimeInterval:0.1f target:self
selector:@selector(audioPowerChange)
userInfo:nil
repeats:YES];
}
return _timer;
}
- (void)audioPowerChange
{
[self.audioRecorder
updateMeters];//更新测量值
float power = [self.audioRecorder
averagePowerForChannel:0];//取得第一个通道的音频,注意音频强度-160到0
CGFloat progress = (1.0 / 160) * (power + 160.0);
[self.progress
setProgress:progress];
}
//点击录音按钮
- (void)start:(id)sender {
if (![self.audioRecorder
isRecording]) {
NSLog(@"录音开始");
[self.audioRecorder
record];
self.timer.fireDate = [NSDate
distantPast];
}
}
- (void)pause:(id)sender {
if ([self.audioRecorder
isRecording]) {
[self.audioRecorder
pause];
self.timer.fireDate = [NSDate
distantFuture];
}
}
//- (void)resume:(id)sender {
// [self start:sender];
//}
- (void)stop:(id)sender {
[self.audioRecorder
stop];
self.timer.fireDate = [NSDate
distantFuture];
self.progress.progress = 0.0;
}
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
if (![self.audioPlayer
isPlaying]) {
[self.audioPlayer
play];
}
NSLog(@"录制完成");
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
- (void)dealloc {
[_start
release];
[_pause
release];
[_resume
release];
[_stop
release];
[_progress
release];
[super dealloc];
}
@end
// RecordViewController.m
// SunshineMusic
//
// Created by dllo on 16/1/14.
// Copyright © 2016年 G.Group. All rights reserved.
//
#import "RecordViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "BaseButton.h"
#import "BaseImageView.h"
#import <Masonry.h>
#import "MusicTool.h"
#define kRecordAudioFile @"myRecord.caf"
@interface
RecordViewController () <AVAudioRecorderDelegate>
@property (nonatomic,
retain) AVAudioRecorder *audioRecorder;
@property (nonatomic,
retain) NSTimer *timer;
@property (nonatomic,
retain) AVAudioPlayer *audioPlayer;
@property (retain,
nonatomic) BaseButton *start;
@property (retain,
nonatomic) BaseButton *pause;
@property (retain,
nonatomic) BaseButton *resume;
@property (retain,
nonatomic) BaseButton *stop;
@property (retain,
nonatomic) UIProgressView *progress;
@property (nonatomic,
retain) BaseImageView *imageV;
@end
@implementation RecordViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self
createSubViews];
[self
setAudioSession];
}
- (void)createSubViews
{
self.view.backgroundColor = [UIColor
whiteColor];
[self imageV];
[self
createButtons];
[self progress];
}
- (BaseImageView *)imageV
{
if (!_imageV) {
_imageV = [BaseImageView
new];
_imageV.image = [UIImage
imageNamed:@"formdetailback"];
[self.view
addSubview:_imageV];
[_imageV mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
}
return
_imageV;
}
- (void)createButtons
{
self.start = [BaseButton
new];
self.start.layer.masksToBounds =
YES;
[self.start
setTitle:@"开始"
forState:UIControlStateNormal];
self.start.layer.cornerRadius = 25;
[self.start
addTarget:self
action:@selector(start:)
forControlEvents:UIControlEventTouchUpInside];
self.start.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.start];
self.pause = [BaseButton
new];
[self.pause
setTitle:@"暂停"
forState:UIControlStateNormal];
self.pause.layer.masksToBounds =
YES;
self.pause.layer.cornerRadius = 25;
[self.pause
addTarget:self
action:@selector(pause:)
forControlEvents:UIControlEventTouchUpInside];
self.pause.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.pause];
self.resume = [BaseButton
new];
[self.resume
setTitle:@"重新"
forState:UIControlStateNormal];
self.resume.layer.masksToBounds =
YES;
self.resume.layer.cornerRadius = 25;
// [self.resume addTarget:self action:@selector(resume:) forControlEvents:UIControlEventTouchUpInside];
self.resume.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.resume];
self.stop = [BaseButton
new];
[self.stop
setTitle:@"结束"
forState:UIControlStateNormal];
self.stop.layer.masksToBounds =
YES;
self.stop.layer.cornerRadius = 25;
[self.stop
addTarget:self
action:@selector(stop:)
forControlEvents:UIControlEventTouchUpInside];
self.stop.backgroundColor = [UIColor
redColor];
[self.view
addSubview:self.stop];
[self.start mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view.mas_centerY).offset(-160);
make.centerY.equalTo(self.view.mas_bottom).offset(-150);
make.height.width.equalTo(@50);
}];
[self.pause mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.start).offset(-100);
make.centerY.equalTo(self.start);
make.width.height.equalTo(self.start);
}];
[self.resume mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.start).offset(100);
make.centerY.equalTo(self.start);
make.width.height.equalTo(self.start);
}];
[self.stop mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.resume).offset(100);
make.centerY.equalTo(self.start);
make.width.height.equalTo(self.start);
}];
}
- (UIProgressView *)progress
{
if (!_progress) {
_progress = [UIProgressView
new];
[self.view
addSubview:_progress];
[_progress mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view).offset(-30);
make.centerX.equalTo(self.view);
make.width.mas_equalTo(300);
make.height.mas_equalTo(5);
}];
}
return
_progress;
}
- (void)setAudioSession
{
AVAudioSession *session = [AVAudioSession
sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord
error:nil];
[session setActive:YES
error:nil];
}
- (NSURL *)getSavePath
{
NSString *urlStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)
lastObject];
urlStr = [urlStr stringByAppendingPathComponent:kRecordAudioFile];
NSURL *url = [NSURL
fileURLWithPath:urlStr];
NSLog(@"%@", url);
return url;
}
- (NSDictionary *)getAudioSetting
{
NSMutableDictionary *dicM = [NSMutableDictionary
dictionary];
//设置录音格式
[dicM setObject:@(kAudioFormatLinearPCM)
forKey:AVFormatIDKey];
//设置录音采样率 8000是电话采样率,对于一般录音已经足够了
[dicM setObject:@(8000)
forKey:AVSampleRateKey];
//设置通道这里采用单声道
[dicM setObject:@(1)
forKey:AVNumberOfChannelsKey];
//每个采样点位数,
分为8, 16, 24, 32
[dicM setObject:@(8)
forKey:AVLinearPCMBitDepthKey];
//是否使用浮点数采样
[dicM setObject:@(YES)
forKey:AVLinearPCMIsFloatKey];
return dicM;
}
- (AVAudioRecorder *)audioRecorder
{
if (!_audioRecorder) {
NSURL *url = [self
getSavePath];
//创建录音格式设置
NSDictionary *setting = [self
getAudioSetting];
//创建录音机
NSError *error =
nil;
_audioRecorder = [[AVAudioRecorder
alloc] initWithURL:url
settings:setting error:&error];
_audioRecorder.delegate =
self;
_audioRecorder.meteringEnabled =
YES;//如果要监控声波则必须设置为yes
if (error) {
NSLog(@"创建录音机发生错误");
}
}
return
_audioRecorder;
}
//创建播放器
- (AVAudioPlayer *)audioPlayer
{
if (!_audioPlayer) {
NSURL *url=[self
getSavePath];
NSError *error=nil;
NSString *s = [NSString
stringWithContentsOfURL:url encoding:NSUTF8StringEncoding
error:nil];
NSLog(@"______%@", s);
_audioPlayer=[[AVAudioPlayer
alloc]initWithContentsOfURL:url
error:&error];
_audioPlayer.numberOfLoops = 0;
[_audioPlayer
prepareToPlay];
if (error) {
NSLog(@"创建播放器过程中发生错误,错误信息:%@",error.localizedDescription);
return
nil;
}
}
return
_audioPlayer;
}
- (NSTimer *)timer
{
if (!_timer) {
_timer = [NSTimer
scheduledTimerWithTimeInterval:0.1f target:self
selector:@selector(audioPowerChange)
userInfo:nil
repeats:YES];
}
return _timer;
}
- (void)audioPowerChange
{
[self.audioRecorder
updateMeters];//更新测量值
float power = [self.audioRecorder
averagePowerForChannel:0];//取得第一个通道的音频,注意音频强度-160到0
CGFloat progress = (1.0 / 160) * (power + 160.0);
[self.progress
setProgress:progress];
}
//点击录音按钮
- (void)start:(id)sender {
if (![self.audioRecorder
isRecording]) {
NSLog(@"录音开始");
[self.audioRecorder
record];
self.timer.fireDate = [NSDate
distantPast];
}
}
- (void)pause:(id)sender {
if ([self.audioRecorder
isRecording]) {
[self.audioRecorder
pause];
self.timer.fireDate = [NSDate
distantFuture];
}
}
//- (void)resume:(id)sender {
// [self start:sender];
//}
- (void)stop:(id)sender {
[self.audioRecorder
stop];
self.timer.fireDate = [NSDate
distantFuture];
self.progress.progress = 0.0;
}
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
if (![self.audioPlayer
isPlaying]) {
[self.audioPlayer
play];
}
NSLog(@"录制完成");
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
- (void)dealloc {
[_start
release];
[_pause
release];
[_resume
release];
[_stop
release];
[_progress
release];
[super dealloc];
}
@end
相关文章推荐
- 使用Provider时提示:Unable to get provider...
- 开通CSDN博客
- 字符串操作strcpy、strstr、strcat函数如何实现
- 4-漏洞扫描
- 安装Mindjet MindManager出现Command line option syntax error.Type Command /?for Help.错误
- Spinner用法小结
- java.lang.OutOfMemoryError : Java heap space
- Ubuntu上安装MySQL并配置远程登录
- 将博客搬至CSDN
- CoreSpotlight(简介)
- 分布式与集群
- CSSearchableIndex
- 大二上java结课实验:模仿炸弹人的小游戏
- CSSearchableItem
- vijos P1134 矩形覆盖 题解
- Codeforces edu 6 ABCDEF
- Centos6.5 网络配置
- 【NYOJ】[64]鸡兔同笼
- Java DatagramSocket(UDP)要注意的问题
- 判断移动网络是否连接可用!