iOS 录音功能的实现
这两天也调了一下ios的录音,原文链接:http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1
这里ios的录音功能主要依靠AVFoundation.framework与CoreAudio.framework来实现

在工程内添加这两个framework
我这里给工程命名audio_text
在生成的audio_textViewController.h里的代码如下
- #import <UIKit/UIKit.h>
- #import <AVFoundation/AVFoundation.h>
- #import <CoreAudio/CoreAudioTypes.h>
- @interface audio_textViewController : UIViewController {
- IBOutlet UIButton *bthStart;
- IBOutlet UIButton *bthPlay;
- IBOutlet UITextField *freq;
- IBOutlet UITextField *value;
- IBOutlet UIActivityIndicatorView *actSpinner;
- BOOL toggle;
- //Variable setup for access in the class
- NSURL *recordedTmpFile;
- AVAudioRecorder *recorder;
- NSError *error;
- }
- @property (nonatomic,retain)IBOutlet UIActivityIndicatorView *actSpinner;
- @property (nonatomic,retain)IBOutlet UIButton *bthStart;
- @property (nonatomic,retain)IBOutlet UIButton *bthPlay;
- -(IBAction)start_button_pressed;
- -(IBAction)play_button_pressed;
- @end
audio_textViewController.m
- #import "audio_textViewController.h"
- @implementation audio_textViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- //Start the toggle in true mode.
- toggle = YES;
- bthPlay.hidden = YES;
- //Instanciate an instance of the AVAudioSession object.
- AVAudioSession * audioSession = [AVAudioSession sharedInstance];
- //Setup the audioSession for playback and record.
- //We could just use record and then switch it to playback leter, but
- //since we are going to do both lets set it up once.
- [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];
- //Activate the session
- [audioSession setActive:YES error: &error];
- }
- /*
- // The designated initializer. Override to perform setup that is required before the view is loaded.
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- // Custom initialization
- }
- return self;
- }
- */
- /*
- // Implement loadView to create a view hierarchy programmatically, without using a nib.
- - (void)loadView {
- }
- */
- /*
- // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- - (void)viewDidLoad {
- [super viewDidLoad];
- }
- */
- /*
- // Override to allow orientations other than the default portrait orientation.
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
- // Return YES for supported orientations
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
- }
- */
- - (IBAction) start_button_pressed{
- if(toggle)
- {
- toggle = NO;
- [actSpinner startAnimating];
- [bthStart setTitle:@"停" forState: UIControlStateNormal ];
- bthPlay.enabled = toggle;
- bthPlay.hidden = !toggle;
- //Begin the recording session.
- //Error handling removed. Please add to your own code.
- //Setup the dictionary object with all the recording settings that this
- //Recording sessoin will use
- //Its not clear to me which of these are required and which are the bare minimum.
- //This is a good resource: http://www.totodotnet.net/tag/avaudiorecorder/
- NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init];
- [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
- [recordSetting setValue:[NSNumber numberWithFloat:[freq.text floatValue]] forKey:AVSampleRateKey];
- [recordSetting setValue:[NSNumber numberWithInt: [value.text intValue]] forKey:AVNumberOfChannelsKey];
- //Now that we have our settings we are going to instanciate an instance of our recorder instance.
- //Generate a temp file for use by the recording.
- //This sample was one I found online and seems to be a good choice for making a tmp file that
- //will not overwrite an existing one.
- //I know this is a mess of collapsed things into 1 call. I can break it out if need be.
- recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]]];
- NSLog(@"Using File called: %@",recordedTmpFile);
- //Setup the recorder to use this file and record to it.
- recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error];
- //Use the recorder to start the recording.
- //Im not sure why we set the delegate to self yet.
- //Found this in antother example, but Im fuzzy on this still.
- [recorder setDelegate:self];
- //We call this to start the recording process and initialize
- //the subsstems so that when we actually say "record" it starts right away.
- [recorder prepareToRecord];
- //Start the actual Recording
- [recorder record];
- //There is an optional method for doing the recording for a limited time see
- //[recorder recordForDuration:(NSTimeInterval) 10]
- }
- else
- {
- toggle = YES;
- [actSpinner stopAnimating];
- [bthStart setTitle:@"开始录音" forState:UIControlStateNormal ];
- bthPlay.enabled = toggle;
- bthPlay.hidden = !toggle;
- NSLog(@"Using File called: %@",recordedTmpFile);
- //Stop the recorder.
- [recorder stop];
- }
- }
- - (void)didReceiveMemoryWarning {
- // Releases the view if it doesn't have a superview.
- [super didReceiveMemoryWarning];
- // Release any cached data, images, etc that aren't in use.
- }
- -(IBAction) play_button_pressed{
- //The play button was pressed...
- //Setup the AVAudioPlayer to play the file that we just recorded.
- AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error];
- [avPlayer prepareToPlay];
- [avPlayer play];
- }
- - (void)viewDidUnload {
- // Release any retained subviews of the main view.
- // e.g. self.myOutlet = nil;
- //Clean up the temp file.
- NSFileManager * fm = [NSFileManager defaultManager];
- [fm removeItemAtPath:[recordedTmpFile path] error:&error];
- //Call the dealloc on the remaining objects.
- [recorder dealloc];
- recorder = nil;
- recordedTmpFile = nil;
- }
- - (void)dealloc {
- [super dealloc];
- }
- @end
最后在interface builder里面绘制好界面,如

设置下按键的属性

基本就ok了,可以开始录音了。
OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 category = kAudioSessionCategory_PlayAndRecord;
error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, NULL, self);
UInt32 inputAvailable = 0;
UInt32 size = sizeof(inputAvailable);
AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, NULL, self);
AudioSessionSetActive(true);
2.在录制声音开始的时候先把播放声音stop,加入
UInt32 category = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
这样做应该会让你的录制启动速度显著加快的。
iOS 录音功能的实现的更多相关文章
- iOS中调用系统录音功能及其播放
最近做的项目中,用到了录音的功能,简单记录一下. 我的想法是:通过重写button的点击事件,来达到录音的目的. /*----------------------------------[录音]--- ...
- IOS开发实现录音功能
导入框架: ? 1 #import <AVFoundation/AVFoundation.h> 声明全局变量: ? 1 2 3 4 5 @interface ViewController ...
- ios中录音功能的实现AudioSession的使用
这个星期我完成了一个具有基本录音和回放的功能,一开始也不知道从何入手,也查找了很多相关的资料.与此同时,我也学会了很多关于音频方面的东西,这也对后面的录音配置有一定的帮助.其中参照了<iPhon ...
- iOS 使用AVAudioPlayer开发录音功能
最近要做一个类似对讲的功能,所以需要用到录音上传,然后再播放的功能. 一.音频格式分析 因为之前没研究过音频这块,所以很多音频格式都是第一次见. AAC: AAC其实是"高级音频编码(adv ...
- 一篇对iOS音频比较完善的文章
转自:http://www.cnblogs.com/iOS-mt/p/4268532.html 感谢作者:梦想通 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也 ...
- iOS开发之微信聊天工具栏的封装
之前山寨了一个新浪微博(iOS开发之山寨版新浪微博小结),这几天就山寨个微信吧.之前已经把微信的视图结构简单的拖了一下(IOS开发之微信山寨版),今天就开始给微信加上具体的实现功能,那么就先从微信的聊 ...
- IOS开发之音频--录音
前言:本篇介绍录音. 关于录音,这里提供更为详细的讲解网址:http://www.cnblogs.com/kenshincui/p/4186022.html#audioRecord ,并且该博客有更 ...
- Unity3D 实现简单的语音聊天 [iOS版本]
现在很多手机游戏中的聊天系统都加入语音聊天的功能,相比于传统的文字聊天,语音聊天在MMORPG中显得尤为重要,毕竟直接口头交流总比你码字快得多了,也更直观些. 实现语音聊天的方法很多,U3D中有不少第 ...
- 李洪强iOS开发之-环信05_EaseUI 使用指南
李洪强iOS开发之-环信05_EaseUI 使用指南 EaseUI 使用指南 简介 EaseUI 封装了 IM 功能常用的控件(如聊天会话.会话列表.联系人列表).旨在帮助开发者快速集成环信 SDK. ...
随机推荐
- JavaScript高级 面向对象(10)--onload与jq中ready的区别
说明(2017.4.2): 1. 在body中放一个img标签,src链接一张图片,那么页面会先读取html的document文档,然后再读取外部资源(这里没加onload其实就是从上往下顺序读取). ...
- slimphp中间件调用流程的理解
slimphp是一款微型php框架,主要是处理http请求,并调用合适的程序处理,并返回一个http响应. 它遵循php的psr7规范,可以很方便的集成其它遵循psr7规范的php组建. 当读到中间件 ...
- FireFox火狐不能收藏书签
这个问题遇到过好几次了,最好还是记一下. 方法有以下几种: 禁用拓展:附加组件管理器. http://tieba.baidu.com/p/3034493996 禁用拓展:tab mix plus. h ...
- 关于JXL读写以及修改EXCEL文件<转>
首先引用网上的文章,谈谈JXL与POI的区别 POI为apache公司的一个子项目,主要是提供一组操作windows文档的Java API. Java Excel俗称jxl是一开放源码项目,通过它Ja ...
- FusionCharts JavaScript API - Events 全局事件处理
FusionCharts JavaScript API - Events 全局事件处理 Home > FusionCharts XT and JavaScript > API Refere ...
- ubuntu 12.10 默认安装php5-fpm无监听9000端口,nginx无法链接php5-fpm修正
升级php5的时候,发现nginx无法链接到php5,怀疑是php5端口的问题. netstat -an未发现监听9000端口. 查看/var/log/php5-fpm.log一切正常. 随后查看/e ...
- 查看linux硬件信息
more /proc/cpuinfo more /proc/meminfo more /proc/*info lspci 查看主板信息等cat /proc/cpuinfo CPU信息cat /proc ...
- tomcat:run和tomcat7:run的区别,以及Apache Tomcat Maven Plugin 相关
起因: 同事部署的maven项目,之前使用 jetty,现在切换到 tomcat,但是他使用的命令是 tomcat:run ,而不是 tomcat7:run,能启动,但出现问题了. 于是搜索了一番,想 ...
- mac下普通用户无法创建crontab的问题解决
想在mac下弄一个crontab定时任务,以为会像linux上那样顺利那,结果碰壁了,报错信息例如以下: ➜ autoshell crontab -ecrontab: no crontab for ...
- Linux Vi/Vim 的使用及实例
什么是 vim? Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是 ...