准备录制崩溃问题

3
我已经阅读了苹果的文档,关于AVAudioRecorder的使用。链接如下:http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html#//apple_ref/doc/uid/TP40009767-CH2-SW6。我找到了一个录制声音的函数,但是我的代码在此处崩溃:
[soundRecorder prepareToRecord]; 

我搜索了很多次,但没有找到解决方案。我还找到了一些其他的源代码,但它们也有同样的问题(在prepareToRecord上崩溃)。请问有人可以帮帮我吗...
这是我的IBAction
- (IBAction) recordOrStop: (id) sender {

if (recording) {

    [soundRecorder stop];
    recording = NO;
    self.soundRecorder = nil;

    [recordOrStopButton setTitle: @"Record" forState:
     UIControlStateNormal];
    [recordOrStopButton setTitle: @"Record" forState:
     UIControlStateHighlighted];
    [[AVAudioSession sharedInstance] setActive: NO error: nil];

} else {

    [[AVAudioSession sharedInstance]
     setCategory: AVAudioSessionCategoryRecord
     error: nil];

    NSDictionary *recordSettings =
    [[NSDictionary alloc] initWithObjectsAndKeys:
     [NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
     [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
     [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
     [NSNumber numberWithInt: AVAudioQualityMax],
     AVEncoderAudioQualityKey,
     nil];
    AVAudioRecorder *newRecorder =
    [[AVAudioRecorder alloc] initWithURL: soundFileURL
                                settings: recordSettings
                                   error: nil];



    self.soundRecorder = newRecorder;

    soundRecorder.delegate = self;
    [soundRecorder prepareToRecord];
    [soundRecorder record];
    [recordOrStopButton setTitle: @"Stop" forState: UIControlStateNormal];
    [recordOrStopButton setTitle: @"Stop" forState: UIControlStateHighlighted];

    recording = YES;
}

}

My .h file

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
#import "MBProgressHUD.h"

LyricsController 是一个继承自 UIViewController 的类,遵循 AVAudioSessionDelegate、AVAudioRecorderDelegate 和 MBProgressHUDDelegate 协议。该类定义了一个“代码块”,其中包含了一些属性和方法。
IBOutlet UITextView *LyricsView;
MBProgressHUD *HUD;
AVAudioRecorder * soundRecorder;
NSURL *soundFileURL;  

BOOL recording;
BOOL playing;

__weak IBOutlet UIButton *recordOrStopButton;
}@property(strong,nonatomic)NSURL *soundFileURL;
@property(nonatomic,strong)AVAudioRecorder * soundRecorder;

我的 PrepareToRecord 有时候工作,有时候不工作。为什么会这样? - user1228103
[soundRecorder record] 在 [soundRecorder prepareToRecord] 后只有一行代码。可能是缓冲区没有准备好。创建一个新的按钮,标记为“准备录音”,并附加一个新的IBAction“记录”。在那里放置 [soundRecorder record]。 - Teofilo Israel Vizcaino Rodrig
但编译器只执行了 [soundRecorder prepareToRecord],甚至没有开始编译 [soundRecorder record]。我在 [soundRecorder prepareToRecord] 和 [soundRecorder record] 语句之间放置了 Sleep(2) 来增加缓冲准备时间,但仍然发生了相同的崩溃。 - user1228103
1
嘿,大家好,我的应用在设备上没有崩溃,只是在模拟器上崩溃。然后我重置了模拟器并清理了Xcode(产品->清理)。然后它再次在模拟器上完美运行。希望它不会再次崩溃。 - user1228103
2个回答

3

这只是因为您使用了断点。我也遇到了同样的问题,我的代码没有崩溃,但它在prepareTorecord处停止了作为断点,即使我没有在上面设置任何断点。如果您禁用xcode的断点,则模拟器也将运行。


一旦禁用断点,它就可以完美地工作。看起来像是模拟器的一个bug。 - bpolat

1

引用自 this answer:

添加异常断点并将异常类型从“所有”更改为“Objective-C异常”。AudioToolbox中的某些类会抛出常规的C++异常,您可以通过这种方式过滤它们。

至于为什么:

“AVAudioPlayer不应该抛出随机异常” - 这不在我们的掌控之中。这就是框架的编写方式,你必须接受它。虽然我同意这不是一个好主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接