文档章节

简易的OC录音机

C
 CBETA-陈
发布于 2016/05/23 08:14
字数 421
阅读 7
收藏 0

 

//类库

CoreGraphics.framework

Foundation.framework

AVFoundation.framework

UIKit.framework

 

 

 

 

 

//控制器.h

 

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface ViewController : UIViewController<AVAudioPlayerDelegate,AVAudioRecorderDelegate>//协议

@property (strong, nonatomic) AVAudioRecorder *audioRecorder;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

@property   UIButton *recordButton;//录音按钮
@property   UIButton *playButton;//播放按钮

-(void)recordButtonAction:(id)sender;//方法
-(void)playButtonAction:(id)sender;

@end

 

 

 

 

 

 

 

 

//控制器.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];

//初始化按钮
    self.recordButton = [UIButton  buttonWithType:UIButtonTypeCustom];
    self.recordButton.frame = CGRectMake(80, 202, 200, 200);
    [self.recordButton setImage:[UIImage imageNamed:@"record"] forState:UIControlStateNormal];
    [self.recordButton  addTarget:self action:@selector(recordButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    self.recordButton.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.recordButton];
    
    
    
    
    self.playButton = [UIButton  buttonWithType:UIButtonTypeCustom];
    self.playButton.frame = CGRectMake(100, 102, 200, 200);
    [self.playButton setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal];
    [self.playButton  addTarget:self action:@selector(playButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.playButton];
    self.playButton.backgroundColor = [UIColor blackColor];
    self.playButton.hidden = YES;
    
    //配置Recorder,
    NSDictionary *recordSetting = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [NSNumber numberWithInt:AVAudioQualityLow],AVEncoderAudioQualityKey,
                                   [NSNumber numberWithInt:16],AVEncoderBitRateKey,
                                   [NSNumber numberWithInt:2],AVNumberOfChannelsKey,
                                   [NSNumber numberWithFloat:44100.0],AVSampleRateKey,
                                   nil];
    //录音文件保存地址的URL
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/record.caf", [[NSBundle mainBundle] resourcePath]]];
    NSError *error = nil;
    self.audioRecorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&error];
    
    if (error != nil) {
        NSLog(@"Init audioRecorder error: %@",error);
    }else{
        //准备就绪,等待录音,注意该方法会返回Boolean,最好做个成功判断,因为其失败的时候无任何错误信息抛出
        if ([self.audioRecorder prepareToRecord]) {
            NSLog(@"Prepare successful");
        }
    }
    

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

//方法

-(void)recordButtonAction:(id)sender
{
    if (!self.audioRecorder.recording) {
        self.playButton.hidden = YES;
        [self.audioRecorder record];
        [self.recordButton setImage:[UIImage imageNamed:@"MicButtonPressed.png"] forState:UIControlStateNormal];
    }else {
        self.playButton.hidden = NO;
        [self.audioRecorder stop];
        [self.recordButton setImage:[UIImage imageNamed:@"MicButton.png"] forState:UIControlStateNormal];
    }
}

-(void)playButtonAction:(id)sender
{
    if (!self.audioPlayer.playing) {
        self.recordButton.hidden = YES;
        NSError *error;
        NSLog(@"%@",self.audioRecorder.url);
        self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.audioRecorder.url error:&error];
        self.audioPlayer.delegate = self;
        if (error != nil) {
            NSLog(@"Wrong init player:%@", error);
        }else{
            [self.audioPlayer play];
        }
        [self.playButton setImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
    }else {
        self.recordButton.hidden = NO;
        [self.audioPlayer pause];
        [self.playButton setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
    }
}

#pragma mark audio delegate
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    NSLog(@"Finsh playing");
    self.recordButton.hidden = NO;
    [self.playButton setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];
    
}

-(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
{
    NSLog(@"Decode Error occurred");
}

-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
    NSLog(@"Finish record!");
}

-(void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error
{
    NSLog(@"Encode Error occurred");
}


@end

 

© 著作权归作者所有

共有 人打赏支持
上一篇: FMDB 的增删改查
下一篇: 简易录音机
C
粉丝 0
博文 5
码字总数 3395
作品 0
朝阳
私信 提问
AppCode 3.1.2 更新,Objective-C 的集成开发环境

AppCode 3.1.2 更新,包括大量的 Swift bug 修复,可以直接从 IDE 更新,也可以在这里下载。 详细 Swift 相关 bug 修复: New class/file wizard is available for Swift now (): We procee...

oschina
2015/01/17
1K
5
AppCode 3.0.3 发布,bug 修复版本

AppCode 3.0.3 发布,此版本是个 bug 修复更新版本: OC-9910 – Incorrect indentation of method’s block arguments; OC-10033 – Merge Tool unable to merge resolving conflicts; OC-9......

oschina
2014/07/31
1K
5
AppCode 3.3.2 EAP 发布

AppCode 3.3.2 EAP 发布,更新内容如下: Apple TV simulators Swift “Surround with do/catch” and “Propagate call error with try” quick-fixes are available for throwing functio......

oschina
2015/11/19
1K
1
AppCode 3.3.1 bug 修复更新

AppCode 3.3.1 bug 修复更新发布。 如果你正使用 AppCode 3.3,你会得到更新通知,你也可以手工检查更新,重新下载请点这里: AppCode 。 3.3 版本重要更新如下: Problem with running apps...

oschina
2015/11/12
951
0
AppCode 3.1.3 发布,Objective-C 集成开发环境

AppCode 3.1.3 发布,此版本现已提供下载,IDE 中系统会自动提示更新。此版本主要是改进 Swift 支持,包括一些 Swift 1.2 引入的新特性。 主要改进: 参数信息 Swift 模块自动完成功能 Swif...

oschina
2015/02/26
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
12
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
16
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
20
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
11
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部