这两天也调了一下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里的代码如下

  1. #import <UIKit/UIKit.h>
  2. #import <AVFoundation/AVFoundation.h>
  3. #import <CoreAudio/CoreAudioTypes.h>
  4. @interface audio_textViewController : UIViewController {
  5. IBOutlet UIButton *bthStart;
  6. IBOutlet UIButton *bthPlay;
  7. IBOutlet UITextField *freq;
  8. IBOutlet UITextField *value;
  9. IBOutlet UIActivityIndicatorView *actSpinner;
  10. BOOL toggle;
  11. //Variable setup for access in the class
  12. NSURL *recordedTmpFile;
  13. AVAudioRecorder *recorder;
  14. NSError *error;
  15. }
  16. @property (nonatomic,retain)IBOutlet UIActivityIndicatorView *actSpinner;
  17. @property (nonatomic,retain)IBOutlet UIButton *bthStart;
  18. @property (nonatomic,retain)IBOutlet UIButton *bthPlay;
  19. -(IBAction)start_button_pressed;
  20. -(IBAction)play_button_pressed;
  21. @end

audio_textViewController.m

  1. #import "audio_textViewController.h"
  2. @implementation audio_textViewController
  3. - (void)viewDidLoad {
  4. [super viewDidLoad];
  5. //Start the toggle in true mode.
  6. toggle = YES;
  7. bthPlay.hidden = YES;
  8. //Instanciate an instance of the AVAudioSession object.
  9. AVAudioSession * audioSession = [AVAudioSession sharedInstance];
  10. //Setup the audioSession for playback and record.
  11. //We could just use record and then switch it to playback leter, but
  12. //since we are going to do both lets set it up once.
  13. [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];
  14. //Activate the session
  15. [audioSession setActive:YES error: &error];
  16. }
  17. /*
  18. // The designated initializer. Override to perform setup that is required before the view is loaded.
  19. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  20. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  21. if (self) {
  22. // Custom initialization
  23. }
  24. return self;
  25. }
  26. */
  27. /*
  28. // Implement loadView to create a view hierarchy programmatically, without using a nib.
  29. - (void)loadView {
  30. }
  31. */
  32. /*
  33. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
  34. - (void)viewDidLoad {
  35. [super viewDidLoad];
  36. }
  37. */
  38. /*
  39. // Override to allow orientations other than the default portrait orientation.
  40. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  41. // Return YES for supported orientations
  42. return (interfaceOrientation == UIInterfaceOrientationPortrait);
  43. }
  44. */
  45. - (IBAction)  start_button_pressed{
  46. if(toggle)
  47. {
  48. toggle = NO;
  49. [actSpinner startAnimating];
  50. [bthStart setTitle:@"停" forState: UIControlStateNormal ];
  51. bthPlay.enabled = toggle;
  52. bthPlay.hidden = !toggle;
  53. //Begin the recording session.
  54. //Error handling removed.  Please add to your own code.
  55. //Setup the dictionary object with all the recording settings that this
  56. //Recording sessoin will use
  57. //Its not clear to me which of these are required and which are the bare minimum.
  58. //This is a good resource: http://www.totodotnet.net/tag/avaudiorecorder/
  59. NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init];
  60. [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
  61. [recordSetting setValue:[NSNumber numberWithFloat:[freq.text floatValue]] forKey:AVSampleRateKey];
  62. [recordSetting setValue:[NSNumber numberWithInt: [value.text intValue]] forKey:AVNumberOfChannelsKey];
  63. //Now that we have our settings we are going to instanciate an instance of our recorder instance.
  64. //Generate a temp file for use by the recording.
  65. //This sample was one I found online and seems to be a good choice for making a tmp file that
  66. //will not overwrite an existing one.
  67. //I know this is a mess of collapsed things into 1 call.  I can break it out if need be.
  68. recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]]];
  69. NSLog(@"Using File called: %@",recordedTmpFile);
  70. //Setup the recorder to use this file and record to it.
  71. recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error];
  72. //Use the recorder to start the recording.
  73. //Im not sure why we set the delegate to self yet.
  74. //Found this in antother example, but Im fuzzy on this still.
  75. [recorder setDelegate:self];
  76. //We call this to start the recording process and initialize
  77. //the subsstems so that when we actually say "record" it starts right away.
  78. [recorder prepareToRecord];
  79. //Start the actual Recording
  80. [recorder record];
  81. //There is an optional method for doing the recording for a limited time see
  82. //[recorder recordForDuration:(NSTimeInterval) 10]
  83. }
  84. else
  85. {
  86. toggle = YES;
  87. [actSpinner stopAnimating];
  88. [bthStart setTitle:@"开始录音" forState:UIControlStateNormal ];
  89. bthPlay.enabled = toggle;
  90. bthPlay.hidden = !toggle;
  91. NSLog(@"Using File called: %@",recordedTmpFile);
  92. //Stop the recorder.
  93. [recorder stop];
  94. }
  95. }
  96. - (void)didReceiveMemoryWarning {
  97. // Releases the view if it doesn't have a superview.
  98. [super didReceiveMemoryWarning];
  99. // Release any cached data, images, etc that aren't in use.
  100. }
  101. -(IBAction) play_button_pressed{
  102. //The play button was pressed...
  103. //Setup the AVAudioPlayer to play the file that we just recorded.
  104. AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error];
  105. [avPlayer prepareToPlay];
  106. [avPlayer play];
  107. }
  108. - (void)viewDidUnload {
  109. // Release any retained subviews of the main view.
  110. // e.g. self.myOutlet = nil;
  111. //Clean up the temp file.
  112. NSFileManager * fm = [NSFileManager defaultManager];
  113. [fm removeItemAtPath:[recordedTmpFile path] error:&error];
  114. //Call the dealloc on the remaining objects.
  115. [recorder dealloc];
  116. recorder = nil;
  117. recordedTmpFile = nil;
  118. }
  119. - (void)dealloc {
  120. [super dealloc];
  121. }
  122. @end

最后在interface builder里面绘制好界面,如

设置下按键的属性

基本就ok了,可以开始录音了。

BUG解决
但是大家要注意一个貌似是ios5.0之后引入的bug,就是当你录制音频的时候启动时间往往会比较慢,大概需要3--5秒的时间吧,这种现象尤其在播放的时候立刻切换到录制的时候非常明显。
 
具体的原因我也不是很清楚,感觉应该是更底层的一些bug。目前我的解决方案是这样的。
1.在音频队列的初始化方法中加入代码

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);

这样做应该会让你的录制启动速度显著加快的。

 
csdn转载:http://blog.csdn.net/ch_soft/article/details/7382411

iOS 录音功能的实现的更多相关文章

  1. iOS中调用系统录音功能及其播放

    最近做的项目中,用到了录音的功能,简单记录一下. 我的想法是:通过重写button的点击事件,来达到录音的目的. /*----------------------------------[录音]--- ...

  2. IOS开发实现录音功能

    导入框架: ? 1 #import <AVFoundation/AVFoundation.h> 声明全局变量: ? 1 2 3 4 5 @interface ViewController ...

  3. ios中录音功能的实现AudioSession的使用

    这个星期我完成了一个具有基本录音和回放的功能,一开始也不知道从何入手,也查找了很多相关的资料.与此同时,我也学会了很多关于音频方面的东西,这也对后面的录音配置有一定的帮助.其中参照了<iPhon ...

  4. iOS 使用AVAudioPlayer开发录音功能

    最近要做一个类似对讲的功能,所以需要用到录音上传,然后再播放的功能. 一.音频格式分析 因为之前没研究过音频这块,所以很多音频格式都是第一次见. AAC: AAC其实是"高级音频编码(adv ...

  5. 一篇对iOS音频比较完善的文章

    转自:http://www.cnblogs.com/iOS-mt/p/4268532.html 感谢作者:梦想通 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也 ...

  6. iOS开发之微信聊天工具栏的封装

    之前山寨了一个新浪微博(iOS开发之山寨版新浪微博小结),这几天就山寨个微信吧.之前已经把微信的视图结构简单的拖了一下(IOS开发之微信山寨版),今天就开始给微信加上具体的实现功能,那么就先从微信的聊 ...

  7. IOS开发之音频--录音

    前言:本篇介绍录音. 关于录音,这里提供更为详细的讲解网址:http://www.cnblogs.com/kenshincui/p/4186022.html#audioRecord  ,并且该博客有更 ...

  8. Unity3D 实现简单的语音聊天 [iOS版本]

    现在很多手机游戏中的聊天系统都加入语音聊天的功能,相比于传统的文字聊天,语音聊天在MMORPG中显得尤为重要,毕竟直接口头交流总比你码字快得多了,也更直观些. 实现语音聊天的方法很多,U3D中有不少第 ...

  9. 李洪强iOS开发之-环信05_EaseUI 使用指南

    李洪强iOS开发之-环信05_EaseUI 使用指南 EaseUI 使用指南 简介 EaseUI 封装了 IM 功能常用的控件(如聊天会话.会话列表.联系人列表).旨在帮助开发者快速集成环信 SDK. ...

随机推荐

  1. python学习笔记(22)--漫画生成html最终版

    说明(2017.3.14): 1. 在主文件夹生成一个main.html作为目录 2. 在每个子文件夹生成一个index.html作为看图网页 3. 通过python批量生成html网页,js配合进行 ...

  2. HTML5 Canvas 梦幻的文字飞扬动画教程

    之前为大家介绍了一款HTML5/CSS3 3D文字特效 文字外翻效果.今天为大家带来的是html5 canvas实现的文字漂动动画效果.画面非常梦幻. 在线预览   源码下载 实现代码如下: html ...

  3. 汇编入门学习笔记 (九)—— call和ret

    疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...

  4. 【WPF/WAF】主界面(ShellWindow)引入别的界面布局

    问题:主界面如果只用一个布局文件ShellWindow.xaml,会写得很大很臃肿.需要分为多个布局文件,然后由主界面引入.参考http://waf.codeplex.com/官方的BookLibra ...

  5. 反射方法调用时:参数计数不匹配( parameter count mismatch )

    Invoke方法的参数当中有一个自己的object[],正好你传递的参数也是object[],这样的话invoke就会把你参数数组里面的第一个参数作为参数传递给你要调用的方法,于是就报错了. 解决问题 ...

  6. Linux 系统串口信息查看

    先确认系统启动的时候串口的信息. ECM_5412@chenfl:~$ dmesg | grep tty [ 0.000000] console [tty0] enabled [ 2.511678] ...

  7. am335x USB 驱动框架记录

    参考: http://processors.wiki.ti.com/index.php/AM335x_USB_Driver%27s_Guide http://processors.wiki.ti.co ...

  8. 4G模块ME3760_V2的拨号过程

    AT AT+CFUN=1                          模块功能全打开,上电可以设置默认状态 AT+ZSET="LET_INFO" 掉电后可以保存AT+CFUN ...

  9. 网络硬盘录像机和数字硬盘录像机区别(nvr dvr ipc区别)

    DVR Digital Video Recorder 数字硬盘录像机   NVR  Network Video Recorder  网络硬盘录像机 DVR(数字硬盘录像机)和NVR(网络硬盘录像机)在 ...

  10. Nginx下轻松开启Drupal简洁链接

    大家都知道Drupal在apache环境下使用简洁链接是件很轻松的事,因为官方已经把写好的.htaccess文件附在源代码里,一般在配置里直接就可以打开了.但在Nginx下却没有那么简单,但不用担心, ...