实例编程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录音机就做好了
分享到:
相关推荐
为了实现边播边录,需要确保录音和播放的操作在时间上同步。 3. **多线程编程**:因为音频播放和录制可能需要较长的时间,所以通常在后台线程执行,以避免阻塞主线程。可以使用GCD的`dispatch_async`或`Operation...
6. **SpeakHere.zip**:这可能是一个语音录音和回放的应用,涉及到`AVFoundation`框架,特别是`AVAudioRecorder`和`AVAudioPlayer`的使用,用于录制和播放音频。 7. **SQLiteBooks.zip**:这个示例可能会讲解如何...
通过对Objective-C语言的学习、Xcode工具的使用、UIKit和Core Data框架的理解以及多线程与网络编程等核心技术的掌握,读者可以建立起坚实的iPhone开发基础。同时,通过具体的实践案例分析,本书还能够帮助读者将理论...
3. **编程语言与框架**:介绍了Objective-C和Swift两种主流的开发语言及其特点,同时提到了Cocoa Touch框架的重要性。 4. **用户界面设计**:讲解了如何使用Interface Builder来构建美观且易用的用户界面。 5. **...
2nd Edition》,即《24小时学会iPhone应用开发第二版》,由John Ray撰写,旨在为iOS开发初学者提供一个简单易懂的教学教程,通过大量实例和代码来帮助读者快速掌握iOS应用开发的基础知识和技能。 首先,书中涉及的...
总之,"RecordingTranscoding Xcode iOS 工程"是一个涵盖了iOS音频处理全链路的示例,包括录音、转码和播放。通过学习这个项目,开发者可以深入了解`AVFoundation`框架在音频处理中的应用,以及如何在Xcode中构建和...
在这个项目中,我们主要关注的是其录音和频率分析的功能。 1. **设置音频会话** 在开始收集音频数据之前,需要配置一个音频会话(AVAudioSession),以确定应用程序如何与其他音频源交互。设置正确的Category(如...
根据版权页上的信息,本书的所有权利均受到保护,未经版权所有者和出版社的书面许可,任何部分不得以任何形式或方式复制或传播,包括但不限于电子或机械方式,如复印、录音或任何信息存储和检索系统。 #### 内容...
- **Core Audio**: 提供了音频处理功能,如录音、播放等。 - **OpenAL**: 开放式音频库,用于游戏和其他应用中的高效音频处理。 - **Media Library**: 提供了访问媒体文件的功能。 - **AVFoundation**: 提供多媒体...
它首次在Apple Watch中亮相,随后被应用于iPhone 6s和6s Plus,为Force Touch和3D Touch功能提供了支持。Taptic Engine能够根据不同的用户操作,如轻按、重压或滑动,提供不同程度和类型的振动反馈,从而丰富了用户...
4. API友好:提供了简洁的C语言接口,易于与其他编程语言(如Objective-C和Swift)交互。 二、libmp3lame-ios在iOS开发中的应用 1. 音频录制与编码:利用libmp3lame-ios,开发者可以将iOS设备的麦克风输入转换为高...