您的位置:首页 > 其它

录音的实现

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: