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は、再生モードのときにYESになるBOOLです。シミュレーターではすべて動作しますが、デバイスで実行すると、[レコーダーレコード]は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 に答える