实例编程iPhone 录音和播放
实例编程iPhone 录音和播放是本文要介绍的内容,最近准备做一个关于录音和播放的项目!查了一些资料,很简单的做了一个,下面我就分享一下iPhone的录音和播放的使用心得。iPhone的录音和播放使用到了media层的内容,media层处于cocoa层之下,用到的很大一部分都是c语言的结构。1、引入框架。#import <AVFoundation/AVFoundation.h>2、创建录音项。- (void) prepareToRecord { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *err = nil; [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err]; if(err){ NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); return; } [audioSession setActive:YES error:&err]; err = nil; if(err){ NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); return; } recordSetting = [[NSMutableDictionary alloc] init]; [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; [recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; // Create a new dated file NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0]; NSString *caldate = [now description]; recorderFilePath = [[NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, caldate] retain]; NSURL *url = [NSURL fileURLWithPath:recorderFilePath]; err = nil; recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err]; if(!recorder){ NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]); UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: [err localizedDescription] delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; return; } //prepare to record [recorder setDelegate:self]; [recorder prepareToRecord]; recorder.meteringEnabled = YES; BOOL audioHWAvailable = audioSession.inputIsAvailable; if (! audioHWAvailable) { UIAlertView *cantRecordAlert = [[UIAlertView alloc] initWithTitle: @"Warning" message: @"Audio input hardware not available" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [cantRecordAlert show]; [cantRecordAlert release]; return; } } 以上这个方法就是创建了录音项,其中包括录音的路径和一些音频属性,但只是准备录音还没有录,如果要录的话还要加入以下的方法:(void)startrecorder { [recorder record]; } 这样就在我们创建的路径下开始了录音。完成录音很简单:(void) stopRecording{ [recorder stop]; } 这里顺便提一下录音的代理方法:- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag { NSLog(@"recorder successfully"); UIAlertView *recorderSuccessful = [[UIAlertView alloc] initWithTitle:@"" message:@"录音成功"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [recorderSuccessful show]; [recorderSuccessful release]; } - (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)arecorder error:(NSError *)error { btnRecorder.enabled = NO; UIAlertView *recorderFailed = [[UIAlertView alloc] initWithTitle:@"" message:@"发生错误"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [recorderFailed show]; [recorderFailed release]; } 以上两个代理方法分别指定了录音的成功或失败。录音中有一个的录音对象有一个averagePowerForChannel和peakPowerForChannel的属性分别为声音的最高振幅和平均振幅,有了他们就可以做一个动态的振幅的录音效果。- (void) updateAudioDisplay { if (isStart == NO) { currentTimeLabel.text = @"--:--"; } else { double currentTime = recorder.currentTime; currentTimeLabel.text = [NSString stringWithFormat: @"d:d", (int) currentTime/60, (int) currentTime%60]; //START:code.RecordViewController.setlevelmeters [recorder updateMeters]; [leftLevelMeter setPower: [recorder averagePowerForChannel:0] peak: [recorder peakPowerForChannel: 0]]; if (! rightLevelMeter.hidden) { [rightLevelMeter setPower: [recorder averagePowerForChannel:1] peak: [recorder peakPowerForChannel: 1]]; } //END:code.RecordViewController.setlevelmeters } } 以上就是录音相关的内容。 下面说一下播放的方法: void SystemSoundsDemoCompletionProc ( SystemSoundID soundID, void *clientData) { AudioServicesDisposeSystemSoundID (soundID); ((AudioRecorderPlayerAppDelegate*)clientData).statusLabel.text = @"Stopped"; } -(void)playAudio { //START:code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound // create a system sound id for the selected row SystemSoundID soundID; OSStatus err = kAudioServicesNoError; // special case: vibrate//震动 //soundID = kSystemSoundID_Vibrate; //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.vibratesystemsound"/> // find corresponding CAF file //NSString *cafName = [NSString stringWithFormat: @"%@",recorderFilePath]; //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.rowtonumberstring"/> NSURL *url = [NSURL fileURLWithPath:recorderFilePath]; //NSString *cafPath = //[[NSBundle mainBundle] pathForResource:cafName ofType:@"caf"]; //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.findcafinbundle"/> //NSURL *cafURL = [NSURL fileURLWithPath:url]; //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.fileurlwithpath"/> err = AudioServicesCreateSystemSoundID((CFURLRef) url, &soundID); //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.createsystemsound"/> //END:code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound //START:code.SystemSoundsDemo.SystemSoundsDemoViewController.registercompletionprocandplaysound if (err == kAudioServicesNoError) { // set up callback for sound completion err = AudioServicesAddSystemSoundCompletion //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.addcompletionproc"/> (soundID,// sound to monitor NULL,// run loop (NULL==main) NULL,// run loop mode (NULL==default) SystemSoundsDemoCompletionProc, // callback function //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.completionprocroutine"/> self // data to provide on callback ); //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.addcompletionprocend"/> statusLabel.text = @"Playing"; //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.setlabel"/> AudioServicesPlaySystemSound (soundID); //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.playsound"/> } if (err != kAudioServicesNoError) { //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.errorblockstart"/> CFErrorRef error = CFErrorCreate(NULL, kCFErrorDomainOSStatus, err, NULL); //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.createcferror"/> NSString *errorDesc = (NSString*) CFErrorCopyDescription (error); //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.copycferrordescription"/> UIAlertView *cantPlayAlert = [[UIAlertView alloc] initWithTitle:@"Cannot Play:" message: errorDesc delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [cantPlayAlert show]; [cantPlayAlert release]; [errorDesc release]; //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.releaseerrordescription"/> CFRelease (error); //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.releaseerror"/> } //<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.errorblockend"/> //END:code.SystemSoundsDemo.SystemSoundsDemoViewController.registercompletionprocandplaysound } 通过以上的方法就应该能够实现播放,播放的时候也是可以加入振幅过程的,大家可以试试!这样一个iPhone录音机就做好了!哈哈
实例编程iPhone 录音和播放相关推荐
- 实例编程iPhone 录音和播放(收藏)
分享一下iPhone的录音和播放的使用心得.iPhone的录音和播放使用到了media层的内容,media层处于cocoa层之下,用到的很大一部分都是c语言的结构. 1.引入框架. #import & ...
- iphone 录音与播放同时 音量问题
播放与录音同时开工: AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *err = nil; [audi ...
- iPhone的录音和播放
最近准备做一个关于录音和播放的项目!查了一些资料,很简单的做了一个,下面我就分享一下iPhone的录音和播放的使用心得. iPhone的录音和播放使用到了media层的内容,media层处于cocoa ...
- Android 实时录音和回放,边录音边播放 (KTV回音效果)
原文地址为: Android 实时录音和回放,边录音边播放 (KTV回音效果) 上一篇介绍了如何使用Mediarecorder来录音,以及播放录音.不过并没有达到我的目的,一边录音一边播放.今天就讲解 ...
- unity获取麦克风音量_Unity调取移动端的麦克风进行录音并播放
本文实例为大家分享了Unity调取移动端的麦克风进行录音并播放的具体代码,供大家参考,具体内容如下 1.对MicroPhone类的理解 对麦克风的调用在Unity里主要是用到了MicroPhone这个 ...
- 微信小程序录音与播放录音功能实现
微信小程序录音与播放录音功能实现,话不多说直接上代码实例: test.wxml <button bindtap='start'>开始录音</button> <button ...
- Android录音并播放(mp3或amr格式)
Android项目中媒体是很多人头疼的一个问题,不仅仅因为处理起来很麻烦,而且不同的手机差别很大(和硬件,系统都有关系),今天就总结一下Android中的录音和播放,可保存成mp3或amr格式. 小米 ...
- Android JNI实现录音和播放
1.jni 部分开发,实现录音和播放 2.实现so库有效时间限制 /*** 引用和声明JNI库和函数的类*/public class RecoderJni {static {System.loadLi ...
- AudioRecord 录音和播放的Demo
#AudioRecord 录音和播放的Demo 本文介绍一个AudioRecord的简单录音和播放的示例程序. 录音是需要动态获取权限的! ##主要代码 ###1.AudioRecord录音代码 // ...
最新文章
- CvBlobTrackerCC 多目标跟踪算法简析
- Mysql压测工具mysqlslap 讲解
- # W3C 中文离线教程 2016 年版
- 二柱子2.0编程总结
- ios app上架被拒的问题
- 编译器构造概述(详细)
- 安全和连接是IoT联网设备2大挑战
- java多线程模拟实现12306售票
- Linux配置文件字体颜色
- 马斯克火箭 SpaceX-API、程序员优雅赚钱项目……GitHub 热点速览
- DevExpress v17.2新版亮点——XAF篇
- 兴业银行研发中心笔试题_2021国考笔试成绩即将发布,面试重点考什么?
- .NET伪静态使用以及和纯静态的区别
- LINUX下载编译FreeSwitch
- mysql 分区表 知乎_mysql 分区表
- matlab编程绘制直方图,matlab绘制直方图程序
- 【百度地图2.5D、3D在Vue项目中的使用】嵌入二维百度地图、三维百度地图、多种显示模式风格样式颜色的百度地图
- bittorrent+sync+java_使用BitTorrent-Sync实现双机文件双向同步
- Result的类型分析和总结
- dwcs6中php为什么浏览不了,dreamweaver CS6编辑浏览器列表无法添加浏览器的解决处理...