7

这是我的方法:

-(void) playOrRecord:(UIButton *)sender {
    if (playBool == YES) {
        NSError *error = nil;
        NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"];
        NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
        AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];
        [player setNumberOfLoops:0];
        [player play];      
    }
    else if (playBool == NO) {
        if ([recorder isRecording]) {
            [recorder stop];
            [nowRecording setImage:[UIImage imageNamed:@"NormalNormal.png"] forState:UIControlStateNormal];
            [nowRecording setImage:[UIImage imageNamed:@"NormalSelected.png"] forState:UIControlStateSelected];
        }
        if (nowRecording == sender) {
        nowRecording = nil;
        return;
        }
        nowRecording = sender;
        NSError *error = nil;
        NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"];
        NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
        [sender setImage:[UIImage imageNamed:@"RecordingNormal.png"] forState:UIControlStateNormal];
        [sender setImage:[UIImage imageNamed:@"RecordingSelected.png"] forState:UIControlStateSelected];        
        recorder = [[AVAudioRecorder alloc] initWithURL:fileUrl settings:recordSettings error:&error];
        [recorder record];
    }
}

其中大部分是不言自明的;playBool 是一个 BOOL,在播放模式下为 YES。一切都在模拟器中运行,但是,当我在设备上运行它时,[记录器记录]返回 NO。有没有人知道为什么会这样?

4

5 回答 5

18

如果您的代码中的任何地方都有此设置:

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

将其更改为:

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

设置错误的 AVAudioSession 类别会导致录制/播放失败。

于 2012-06-29T10:14:14.927 回答
4

这是因为您无法修改设备上的 app-bundle(已签名)。您可以录制到应用程序的 docs 文件夹或 tmp 目录。

于 2010-06-21T00:54:18.887 回答
3

好的,解决了我自己的问题;我不知道为什么,但我必须在设备上记录到 NSTemporaryDirectory。改变它完全解决了它。

于 2010-04-22T02:07:46.520 回答
1

我有同样的问题。事实证明,我遇到了错误生成的路径语句。AVAudioRecorder 初始化良好 - 并且没有发生意外 - 但 iOS 根本不允许我写入它。为什么?一探究竟:

    /* The following code will fail - why? It fails because it is trying to write some path that is NOT accessible by
    this app.
NSString *recordedAudioPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
                                objectAtIndex:0] 
                               stringByAppendingString:@"recorded.caf"];
 */
// Correction:
NSString *recordedAudioPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
                               objectAtIndex:0];

recordedAudioPath = [recordedAudioPath stringByAppendingPathComponent:@"recorded.caf"];
NSURL *recordURL = [NSURL fileURLWithPath:recordedAudioPath];

现在这完全有道理。感谢您引导我朝着正确的方向前进。

于 2011-01-02T22:26:57.493 回答
1

另外,确保您的应用程序被允许访问麦克风(即在 iOS 设置中,向下滚动并找到您的应用程序,它应该有“麦克风”,您需要切换到“打开”)

于 2016-09-14T15:58:29.320 回答