2012-03-14 10 views
11

私は現在、アプリ内オーディオレコーディングをサポートするアプリケーションを開発中です。ユーザーは、すでに録画したオーディオファイルをローカルで保存したり、ボタンを押して新しい録画ビューに移動したりすることができます。そこから新しいオーディオセッションを録画することができます。アプリのサンドボックスに保存されます。 この機能は、ほとんどの場合よく機能します。私は、新しいファイルを記録し、アプリからそれらを再生するが、ランダムな時間にオーディオレコーダーは、この方法で録画を開始するために失敗することができます。AVAudioRecorderレコードメソッドは無作為にNOを返します

ある
-(void) startRecording 
{ 
if (!isRecording) 
{ 
    isRecording = YES; 

    BOOL recordingSucess = [audioRecorder record]; 

    if (recordingSucess) 
     NSLog(@"WE STARTED THE RECORDING!"); 
    else 
     NSLog(@"WE DID NOT START THE RECORDING!"); 

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

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

、のNSLogは、私たちは開始されませんでした」プリントアウトされます録音を開始できなかったことを示す。これにより、空のオーディオファイルが、正確に4096バイトの一定のファイルサイズでアプリに保存されます。 これは、オーディオレコーダオブジェクトが初期化されている方法です。

-(id) initWithContentURL:(NSURL *)contentURL 
{ 
self = [super init]; 

if (self) 
{ 
    NSLog(@"Initializing audio recorder!"); 

    // 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; 
} 

もこの時点で私は初期化はしていないようことを確信しているので誤差が、ゼロであるかどうかをチェックのNSLogチェックあり失敗します。 録音方法は、ランダムな時間帯に失敗する可能性がありますが、他のほとんどの時間帯では正常に機能しますか?

答えて

23

記録が開始される前に、オーディオセッションを初期化する必要があります。

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; 
} 

は、参考のために受け入れられanswerを参照してください。

+0

私はこれを試して戻ってきます。バグがなくなることを確認するだけで十分にテストする必要があります – Luffen

+0

これはうまくいきました、ありがとう! :) – Luffen

+0

@Luffen嬉しいです。 4096は、準備としてディスクに書き込まれたメディアファイルのヘッダー部分だと思いますが、録音に失敗し、ファイルのデータ部分が埋めら​​れていません。 –

0

contentURLは常に同じですか、それとも毎回新しいコンテンツURLを生成しますか?

また、レコードの前にprepareToRecordを明示的に呼び出して、それが成功するかどうかを確認できますか?

関連する問題