sinaier 发表于 2013-1-30 20:36:48

实例编程iPhone 录音和播放(收藏)

实例编程iPhone 录音和播放是本文要介绍的内容,最近准备做一个关于录音和播放的项目!查了一些资料,很简单的做了一个,下面我就分享一下iPhone的录音和播放的使用心得。iPhone的录音和播放使用到了media层的内容,media层处于cocoa层之下,用到的很大一部分都是c语言的结构。

1、引入框架。

#import <AVFoundation/AVFoundation.h>

2、创建录音项。
- (void) prepareToRecord
   {
   AVAudioSession *audioSession = ;
   NSError *err = nil;
   ;
   if(err){
   NSLog(@"audioSession: %@ %d %@", , , [ description]);
   return;
   }
   ;
   err = nil;
   if(err){
   NSLog(@"audioSession: %@ %d %@", , , [ description]);
   return;
   }
   recordSetting = [ init];
    forKey:AVFormatIDKey];
    forKey:AVSampleRateKey];
    forKey:AVNumberOfChannelsKey];
    forKey:AVLinearPCMBitDepthKey];
    forKey:AVLinearPCMIsBigEndianKey];
    forKey:AVLinearPCMIsFloatKey];
   // Create a new dated fileNSDate *now = ;
   NSString *caldate = ;
   recorderFilePath = [ retain];
   NSURL *url = ;
   err = nil;
   recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
   if(!recorder){
   NSLog(@"recorder: %@ %d %@", , , [ description]);
   UIAlertView *alert =
   [ initWithTitle: @"Warning"
   message:
   delegate: nilcancelButtonTitle:@"OK"otherButtonTitles:nil];
   ;
   ;
   return;
   }
   //prepare to record
   ;
   ;
   recorder.meteringEnabled = YES;
   BOOL audioHWAvailable = audioSession.inputIsAvailable;
   if (! audioHWAvailable) {
   UIAlertView *cantRecordAlert =
   [ initWithTitle: @"Warning"
   message: @"Audio input hardware not available"
   delegate: nilcancelButtonTitle:@"OK"otherButtonTitles:nil];
   ;   
   ;
   return;}
   }
以上这个方法就是创建了录音项,其中包括录音的路径和一些音频属性,但只是准备录音还没有录,如果要录的话还要加入以下的方法:
(void)startrecorder{
;
}
这样就在我们创建的路径下开始了录音。完成录音很简单:
(void) stopRecording{
;
}
这里顺便提一下录音的代理方法:
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag{
NSLog(@"recorder successfully");
UIAlertView *recorderSuccessful =
[ initWithTitle:@""
message:@"录音成功"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
;
;
}
- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)arecorder error:(NSError *)error{
btnRecorder.enabled = NO;
UIAlertView *recorderFailed =
[ initWithTitle:@"" message:@"发生错误"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
;
;
}
以上两个代理方法分别指定了录音的成功或失败。

录音中有一个的录音对象有一个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
;   
peak: ];
if (! rightLevelMeter.hidden) {
   peak: ];
}
//END:code.RecordViewController.setlevelmeters
}
}
以上就是录音相关的内容。
下面说一下播放的方法:
void SystemSoundsDemoCompletionProc (SystemSoundIDsoundID,void         *clientData){
AudioServicesDisposeSystemSoundID (soundID);
((AudioRecorderPlayerAppDelegate*)clientData).statusLabel.text = @"Stopped";
}
-(void)playAudio{
//START:code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound
// create a system sound id for the selected rowSystemSoundID soundID;
OSStatus err = kAudioServicesNoError;
// special case: vibrate
//震动
//soundID = kSystemSoundID_Vibrate;
//<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.vibratesystemsound"/>
// find corresponding CAF file
//NSString *cafName = ;
//<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.rowtonumberstring"/>
NSURL *url = ;
//NSString *cafPath =
//[ pathForResource:cafName ofType:@"caf"];
//<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.findcafinbundle"/>
//NSURL *cafURL = ;
//<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 completionerr = AudioServicesAddSystemSoundCompletion
//<label id="code.SystemSoundsDemo.SystemSoundsDemoViewController.createsystemsound.addcompletionproc"/>(soundID,
// sound to monitorNULL,
// 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 =[ initWithTitle:@"Cannot Play:"    message: errorDesc    delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];;
;
;
//<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录音机就做好了
页: [1]
查看完整版本: 实例编程iPhone 录音和播放(收藏)