既然iPhone3.0SDK已经公开了,我想我可以为那些已经在玩3.0SDK的人问这个问题了.我想在我的应用程序中录制音频,但我想使用AVAudioRecorder,而不是像示例SpeakHere所示的较旧的录制方式.没有任何示例说明如何在iPhone开发人员中心最好地做到这一点,只引用了类.我是iPhone开发的新手,所以我正在寻找一个简单的样本来开始我的工作.

推荐答案

事实上,根本没有任何例子. 这是我的工作代码.用户按下导航栏上的按钮即可触发录制. 录制使用CD质量(44100个样本)、立体声(2声道)线性PCM.注意:如果您想使用不同的格式,特别是编码格式,请确保您完全了解如何设置AVAudioRecorder设置(请仔细阅读音频类型文档),否则您将永远无法正确初始化它.还有一件事.在代码中,我没有展示如何处理计量数据,但是您可以很容易地弄清楚. 最后,请注意,在编写本文时,AVAudioRecorder方法delete eRecording会使您的应用程序崩溃.这就是为什么我要通过文件管理器删除录制的文件.录制完成后,我使用KVC将录制的音频作为NSData保存在当前编辑的对象中.

#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]


- (void) startRecording{

UIBarButtonItem *stopButton = [[UIBarButtonItem alloc] initWithTitle:@"Stop" style:UIBarButtonItemStyleBordered  target:self action:@selector(stopRecording)];
self.navigationItem.rightBarButtonItem = stopButton;
[stopButton release];

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

// start recording
[recorder recordForDuration:(NSTimeInterval) 10];

}

- (void) stopRecording{

[recorder stop];

NSURL *url = [NSURL fileURLWithPath: recorderFilePath];
NSError *err = nil;
NSData *audioData = [NSData dataWithContentsOfFile:[url path] options: 0 error:&err];
if(!audioData)
    NSLog(@"audio data: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
[editedObject setValue:[NSData dataWithContentsOfURL:url] forKey:editedFieldKey];   

//[recorder deleteRecording];


NSFileManager *fm = [NSFileManager defaultManager];

err = nil;
[fm removeItemAtPath:[url path] error:&err];
if(err)
    NSLog(@"File Manager: %@ %d %@", [err domain], [err code], [[err userInfo] description]);



UIBarButtonItem *startButton = [[UIBarButtonItem alloc] initWithTitle:@"Record" style:UIBarButtonItemStyleBordered  target:self action:@selector(startRecording)];
self.navigationItem.rightBarButtonItem = startButton;
[startButton release];

}

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
{

NSLog (@"audioRecorderDidFinishRecording:successfully:");
// your actions here

}

Ios相关问答推荐

UIBezierPath包含:方法不检测到厚度大于1像素的线上的touch

带外部笔划的圆形进度视图

SwiftUI中的视频时间轴

如何让3张组合的`SF Symbol`图片围绕一个特定点旋转?

如何删除NavigationView中的默认透明标头?

如何解决错误 HE0004:无法在 Visual Studio 2022 中加载框架ContentDeliveryServices

iOS 16 堆栈视图中按钮的奇怪动画

集成 IDNow SDK 时未找到 Xcode FLAnimatedImage.h 文件问题

Swiftui为什么在点击第二行之前背景不起作用

SignalR 永远不会在 iOS 上使用 Xamarin Forms 启动

本月使用 iOS 的天数?

SwiftUI 视图 - viewDidLoad()?

无法验证客户端 3000

UIView 和 initWithFrame 以及一个 NIB 文件.如何加载 NIB 文件?

在原生和 phonegap 之间挣扎,简单的应用需求

什么是伞头?

我可以通过 UIAppearance 代理设置哪些属性?

从故事板导航到其他 Swift 1.2 文件时 Xcode 6.3 崩溃

在 NSUserDefaults 中存储值是否有任何限制?

Twitter api 文本字段值被截断