实例编程iPhone 录音和播放

移动开发 iOS
本文介绍的是实例编程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;  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.

以上这个方法就是创建了录音项,其中包括录音的路径和一些音频属性,但只是准备录音还没有录,如果要录的话还要加入以下的方法:

(void)startrecorder  
{  
[recorder record];  

  • 1.
  • 2.
  • 3.
  • 4.

这样就在我们创建的路径下开始了录音。完成录音很简单:

(void) stopRecording{  
[recorder stop];  

  • 1.
  • 2.
  • 3.

这里顺便提一下录音的代理方法:

- (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];  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

以上两个代理方法分别指定了录音的成功或失败。

录音中有一个的录音对象有一个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  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.

通过以上的方法就应该能够实现播放,播放的时候也是可以加入振幅过程的,大家可以试试!这样一个iPhone录音机就做好了!哈哈

小结:实例编程iPhone 录音和播放的内容介绍完了,希望本文对你有所帮助。

责任编辑:zhaolei 来源: 博客园
相关推荐

2011-08-18 10:32:13

iPhone编程视图

2011-07-26 15:56:53

iPhone 游戏 启动画面

2021-07-09 09:24:41

鸿蒙HarmonyOS应用

2011-07-28 14:19:12

iPhone 网络编程 聊天程序

2011-07-26 11:08:23

iOS 录像 录音

2011-08-10 15:58:58

iPhone视频

2011-07-25 18:02:51

iPhone LibFetion 移植

2016-12-21 16:42:15

androidmediaplayer

2012-06-21 09:28:47

jQuery

2009-07-09 00:25:00

ScalaListTuple

2009-07-09 00:25:00

ScalaSet类Map类

2011-08-08 16:56:44

iPhone 字符处理 视图

2011-07-21 16:48:19

iPhone 游戏

2009-09-07 20:40:48

LINQ子查询

2011-07-06 16:15:46

iPhone 图片

2011-08-08 18:19:09

iPhone音频播放

2011-07-27 09:50:31

iPhone AVAudioPla 音频

2011-07-20 16:21:20

iPhone 视频 播放器

2011-08-02 16:58:15

iPhone AVAudioPla 音频播放

2011-08-17 14:57:31

iPhone应用视频播放
点赞
收藏

51CTO技术栈公众号