文档章节

简易的OC录音机

C
 CBETA-陈
发布于 2016/05/23 08:14
字数 421
阅读 7
收藏 0
点赞 2
评论 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

 

© 著作权归作者所有

共有 人打赏支持
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 ⋅ 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 ⋅ 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 ⋅ 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 ⋅ 0

AppCode 3.1.3 发布,Objective-C 集成开发环境

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

oschina ⋅ 2015/02/26 ⋅ 2

Android开源git40个App源码

(JamsMusicPlayer)很棒的音乐播放器(new) (F8)日程安排的软件 (Conversations)基于XMPP的应用 (Bitocle)可以在手机上查看自己github上的项目 (Amphitheatre)Android TV应用,数据来源于TMDb,...

拉偶有所依 ⋅ 2015/06/03 ⋅ 2

AppCode 3.0.5 发布,Objective-C 集成开发环境

AppCode 3.0.5 发布,此次更新包括 Xcode 6 GM & 6.1 兼容改进;包括对 iPhones 6 和 6 Plus 的至此和;修复了故事板使用新 Xcode 6 自适应演变的问题。同时还修复了一些很重要的 bug: OC-1...

oschina ⋅ 2014/09/13 ⋅ 2

直接开启电脑功能的命令

color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白cmd.exe--------...

lyf执念 ⋅ 2017/12/25 ⋅ 0

AppCode 3.0.2 发布,Objective-C 的集成开发环境

AppCode 3.0.2 发布,此版本是 bug 修复更新,改进了与最新 Xcode 6 beta 版本的兼容性(包括 beta2 和beta3),同时改进了与 iOS 8 的兼容性,修复了一些问题。重要的 bug 修复: OC-10186...

oschina ⋅ 2014/07/12 ⋅ 0

MIUI录音机

MIUI录音机是基于Android原生录音机来开发的,能够运行在Android2.3.3及以上版本。与Android原生录音机相比,MIUI录音机在UI、交互方式和录音效果上都有较大的提升,其磁带的显示效果更是收到...

匿名 ⋅ 2012/02/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部