avaudiorecorderはデバイスに記録されません
-
28-09-2019 - |
質問
これが私の方法です:
-(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は、再生モードの場合はイエスのブールです。ただし、すべてがシミュレータで機能しますが、デバイスで実行すると、[レコーダーレコード]はnoを返します。なぜこれが起こっているのかという手がかりがありますか?
解決 3
わかりました、私自身の質問を解決しました。理由はわかりませんが、デバイス上でnystemporarydirectoryに記録する必要があります。それを完全に修正しました。
他のヒント
コードのどこにでもこのセットアップがある場合:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
に変更してください:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
間違ったavaudiosessionカテゴリを設定すると、レコード/プレイが失敗します。
これは、デバイス上のアプリバンドルを変更できないためです(署名されています)。アプリのDocsフォルダーまたはTMPディレクトリのいずれかに記録できます。
まったく同じ問題がありました。誤って生成されたパスステートメントにぶつかったことがわかりました。 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];
これは今完全に理にかなっています。正しい方向に私を操縦してくれてありがとう。
また、アプリがマイクにアクセスできることを確認してください(つまり、iOS設定で、下にスクロールしてアプリを見つけてください。「オン」に切り替える必要がある「マイク」が必要です)
所属していません StackOverflow