文档章节

简易录音机

C
 CBETA-陈
发布于 2016/05/22 20:23
字数 452
阅读 6
收藏 0
点赞 2
评论 0
  1.  

@interface ViewController : UIViewController<AVAudioRecorderDelegate>

@property (strong, nonatomic) IBOutlet UISegmentedControl *sampleRateSeg;
@property (strong, nonatomic) IBOutlet UISegmentedControl *bitDeptSeg;
@property (strong, nonatomic) IBOutlet UISwitch *stereoSwitch;
@property (strong, nonatomic) IBOutlet UIButton *recordBn;
// 该属性代表了该应用的Documnts目录
@property (nonatomic, copy) NSString* documentsPath;
- (IBAction)clicked:(id)sender;
- (IBAction)play:(id)sender;
@end

2.

#import <AVFoundation/AVFoundation.h>
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
AVAudioRecorder* audioRecorder;
UIImage* recordImage;
UIImage* stopImage;
AVAudioPlayer* audioPlayer;
- (void)viewDidLoad
{
    [super viewDidLoad];
    recordImage = [UIImage imageNamed:@"record.png"];
    stopImage = [UIImage imageNamed:@"stop.png"];
                                  
    [self.recordBn setImage:recordImage forState:UIControlStateNormal];
    // 获取当前应用的音频会话
    AVAudioSession * audioSession = [AVAudioSession sharedInstance];
    // 设置音频类别,PlayAndRecord——这说明当前音频会话即可播放、也可录制
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: nil];
    // 激活当前应用的音频会话
    [audioSession setActive:YES error: nil];
}
//获取document目录的路径
- (NSString*) documentsPath {
    if (! _documentsPath) {
        NSArray *searchPaths =
        NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES);
        _documentsPath = [searchPaths objectAtIndex: 0];
    }
    return _documentsPath;
}
- (IBAction)clicked:(id)sender
{
    if(audioRecorder != nil && audioRecorder.isRecording)
    {
        [audioRecorder stop];
        [self.recordBn setImage:recordImage forState:UIControlStateNormal];
    }
    else
    {
        // 获取音频文件的保存路径
        NSString *destinationString = [[self documentsPath]
            stringByAppendingPathComponent:@"sound.wav"];
        NSURL *destinationURL = [NSURL fileURLWithPath:destinationString];
        // 创建一个NSDictionary,用于保存录制属性
        NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];
        // 设置录制音频的格式
        [recordSettings setObject:[NSNumber numberWithInt:kAudioFormatLinearPCM]
            forKey: AVFormatIDKey];
        NSString* sampleRate = [self.sampleRateSeg titleForSegmentAtIndex:
            self.sampleRateSeg.selectedSegmentIndex];
        // 设置录制音频的采样率
        [recordSettings setObject:[NSNumber numberWithFloat:
            sampleRate.floatValue] forKey: AVSampleRateKey];
        // 设置录制音频的通道数
        [recordSettings setObject:
            [NSNumber numberWithInt:(self.stereoSwitch.on ? 2 : 1)]
            forKey:AVNumberOfChannelsKey];
        NSString* bitDepth = [self.bitDeptSeg titleForSegmentAtIndex:
            self.bitDeptSeg.selectedSegmentIndex];
        // 设置录制音频的每个样点的位数
        [recordSettings setObject: [NSNumber numberWithInt:bitDepth.integerValue]
            forKey:AVLinearPCMBitDepthKey];
        // 设置录制音频采用高位优先的记录格式
        [recordSettings setObject:[NSNumber numberWithBool:YES]
            forKey:AVLinearPCMIsBigEndianKey];
        // 设置采样信号采用浮点数
        [recordSettings setObject:[NSNumber numberWithBool:YES]
            forKey:AVLinearPCMIsFloatKey];
        NSError *recorderSetupError = nil;
        // 初始化AVAudioRecorder
        audioRecorder = [[AVAudioRecorder alloc] initWithURL:destinationURL
            settings:recordSettings  error:&recorderSetupError];
        audioRecorder.delegate = self;
        [audioRecorder record];
        [self.recordBn setImage:stopImage forState:UIControlStateNormal];
    }
}
- (IBAction)play:(id)sender
{
    // 获取音频文件的保存路径
    NSString *destinationString = [[self documentsPath]
        stringByAppendingPathComponent:@"sound.wav"];
    NSURL *url = [NSURL fileURLWithPath:destinationString];
    // 创建AVAudioPlayer对象
    audioPlayer = [[AVAudioPlayer alloc]
        initWithContentsOfURL:url error: nil];
    // 开始播放
    [audioPlayer play];
}
- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder
{
    NSLog(@"被中断!");
}
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)aRecorder
    successfully:(BOOL)flag
{
    if(flag)
    {
        NSLog(@"录制完成!!");
    }
}

 

© 著作权归作者所有

共有 人打赏支持
C
粉丝 0
博文 5
码字总数 3395
作品 0
朝阳
Android开源git40个App源码

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

拉偶有所依 ⋅ 2015/06/03 ⋅ 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

MIUI录音机

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

匿名 ⋅ 2012/02/09 ⋅ 0

windows中dos下命令

windows中下载东西,因为文件大的缘故,下载缓慢,不知道何时下载完,可以通过在windows中使用dos命令,一定时间后自动关机,节约用电等,故此总结常用的dos命令。 mplayer2-------简易widno...

爱情89757 ⋅ 2016/08/13 ⋅ 0

开始-运行-命令大全

gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. logoff---------注销命令 6. tsshutdn-------60秒倒计时关机命令 7....

大德 ⋅ 2012/03/22 ⋅ 0

开始→运行→输入的命令集锦

gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 lusrmgr.msc----本...

Lyle_W ⋅ 2014/10/25 ⋅ 0

android录音机后台运行,进入照相机开启录像功能,怎么停掉后台运行录音机

录音机后台运行,在进入照相机,开启录像功能,怎么停掉后台运行的录音机

爸爸爱果果 ⋅ 2015/08/21 ⋅ 0

命令模式(Command Pattern)

  命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。   命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数...

小菜鸡1 ⋅ 2016/08/16 ⋅ 0

Windows xp 控制台命令一览表

开始→运行→输入的命令集锦 gpedit.msc-------------------------组策略 sndrec32-------------------------录音机 nslookup-------------------------ip地址侦测器 ex...

余二五 ⋅ 2017/11/15 ⋅ 0

Android 来去电自动录音 (三)

好了,捕捉到了去电过程中各个状态的转变,那么,如何通知给程序呢,我采用的方法是捕获后立马给系统发送广播,然后程序进行广播接受,接受后在处理录音事件。要发送广播,就要发送一个唯一的...

sdvdxl ⋅ 2016/10/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 13分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 25分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 58分钟前 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部