2012-03-14 3 views
14

私が開発しているアプリでは、レンガの壁に多少なりとも衝突しました。アプリケーションでは、ローカルに保存されたすべてのオーディオファイルを標準のテーブルビューで一覧表示するビューを入力できます。ここからそれらをクリックして再生するか、下の録画ボタンを押して新しい録画を作成します。その後、自動的にアプリサンドボックスに保存されます。AVAudioRecorderを使ったファイルのランダムな破損(時にはファイルを再生できないことがあります) - iOS

今のところ、このすべては実際にはほとんどの場合完全にうまく機能します。私は座って録音して再生することができます。私は座って、何も問題なく約45回これを繰り返し試すことができます。突然ランダムな時間に、私は非常に奇妙な問題にぶつかります。問題は、レコーダーがどれほど長くレコーディングしても、突然突然、再生できないファイルが壊れてしまい、ちょうど4096バイトのサイズであることです。

私はこのようにそれを設定し、完全に標準的な方法でAVAudioRecorderを使用

:私はこのような記録を開始

// Specific settings for the audio recording 
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithInt:AVAudioQualityMin], 
    AVEncoderAudioQualityKey, 
    [NSNumber numberWithInt:8], 
    AVEncoderBitRateKey, 
    [NSNumber numberWithInt: 2], 
    AVNumberOfChannelsKey, 
    [NSNumber numberWithFloat:22000.0], 
    AVSampleRateKey, 
    nil]; 

NSError *error = nil; 
audioRecorder = [[AVAudioRecorder alloc] 
    initWithURL:contentURL 
    settings:recordSettings 
    error:&error]; 
audioRecorder.delegate = self; 

if (!isRecording) { 
    isRecording = YES; 
    [audioRecorder record]; 

    // Start the timer 
    recordTiming = [NSDate date]; 

    timeCheck = [NSTimer 
     scheduledTimerWithTimeInterval:1.0f 
     target:self 
     selector:@selector(timeCheck) 
     userInfo:nil 
     repeats:YES]; 
} 

そしてこのでそれを止める:

if (isRecording) { 
    [audioRecorder stop]; 

    // Stop the timer 
    [timeCheck invalidate]; 
} 

この問題が発生する原因は何もわかりません。これまで私はほとんどすべてを試しました。私はレコーダーオブジェクトが適切にリサイクルされていることを確認しています(今はそれぞれのレコーディングのために新しいインスタンスを持っています)。また、古い参照が割り当て解除されていて、干渉オブジェクトとは何も関係がないことを確認し、何もそれを解決しません。

壊れたファイルに何が問題を引き起こす可能性があるかについて少し考えている人はいますか?

+1

だからあなたは右、エラー変数がaudioRecorderが初期化された後、常にnilであると言っていますか? –

+0

はい、正しい:)実際には、NSLogが正しく初期化されていること、そしてNSErrorがnilであることを確認するために、以下にいくつかの簡単なエラーチェックがあります。 – CodingBeagle

+0

あなたのコードを改善しましょう。問題は明らかになったり消えたりするはずです。 isRecording変数を使用する代わりに、audioRecorderプロパティの記録を使用できます。私はオーディオセッションの初期化を見ることができませんが、あなたはおそらくそれを省略しました。しかし、私はエラー処理を改善することをお勧めします、以下の答えは参考として使用することができます:http://stackoverflow.com/questions/1010343/how-do-i-record-audio-on-iphone-with -audioudiorecorder –

答えて

6

注:OPは数日間使用されていないため、この質問には今後の一般的な参照のために回答する必要があります。

AVAudioSessionは、記録を開始する前に取得する必要があります。

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; 
} 
err = nil; 
[audioSession setActive:YES error:&err]; 
if(err){ 
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    return; 
} 

参考:https://stackoverflow.com/a/9706731/188331

+0

これは確かに問題でした:)私は古い質問をチェックしたので、それは残念ですが、しばらくありましたが、これは確かに問題の解決策です。 – CodingBeagle