2009-11-10 7 views
8

私はオーディオレコーダーアプリケーションで作業していますが、問題なく動作しています。iPhoneの中断後にレコーディングを再開する方法は?

しかし、私は中断の問題に固執しています。

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder 

このメソッドが呼び出され、録音が一時停止されます。

し、ユーザーが通話拒否した場合:次に、ここ

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder 

を、私はそれが中断された時点から録音を再開します。 しかし、再度レコードメソッドを呼び出すと、レコーディングは新しいファイルから始まります。

+0

あなたが/停止/一時停止の記録を開始するために使用しているコードを投稿してください。 AVAudioRecorderオブジェクトが毎回リリースされ、新しいインスタンスをインスタンス化していますか?これは、別のファイルを使用して録音を開始するたびに理由を説明します。 –

+0

Fyi、私はEnd Intが正常に動作していないことを示す小さなサンプルアプリケーションを作成し、この問題についてAppleに電話をかけました。 2ヶ月以上も彼らと一緒にいて、何も聞いていません。 – ort11

答えて

1

OSは、中断中にAVAudioRecorderを停止させる可能性があります。複数のファイルを1つの録音としてユーザに提示することも、AudioQueueを使用して中断を処理する(オーディオデータをファイルに保存する)コードを記述することもできます。

0

私はこれを少し前にやってみると、正しくできなかったという結論に達しました。オペレーティングシステム自体はあなたにそれをさせません。たぶんそれは3.1.2で変更されましたが、私が3.0で試したときには動作しませんでした。中断を処理するために

0

、あなたはAVAudioSessionDelegateではなくAVAudioRecorderDelegate methods.Thisのmethodes使用する必要が割り込みを処理するためのコードサンプルです:

/*================================================================= 
Interruption Handling Method during Recording 
==================================================================*/ 

- (void) beginInterruption 
{ 
if(self.recorder) 
     { 
    //Method to handle UI 
} 
} 

- (void) endInterruption 
{ 

NSError *err = noErr; 
[[AVAudioSession sharedInstance] setActive: YES error: &err]; 
if(err != noErr) 
{ 
    NSLog([err description]); 
} 
     //method to handle UI 
} 

第一の方法自動的に第2の方法では、オーディオsession.Soを無効にし、オーディオセッションを再開する必要があります。最初の方法は録音を一時停止し、中断が終了すると2番目の方法で再開できます。これをバージョン3.0以降で試しました。

6

問題は解決しました。

この問題を回避するために、録音コードを書き直しました。私はAudioQueuesを使用しました。基本的にバックエンドコードはSpeakHereアプリケーションと同じで、マイナーチェンジもあります。

-(void)resume 
{ 
    AudioQueueStart(queueObject, NULL); 
} 

-(void)pause 
{ 
    AudioQueuePause(queueObject); 
} 

AudioRecorderクラスの場合、さらに2つのAPIが提供されます。基本的な目的は、記録方法で行われる記録設定を避けることです。

割り込みコールバックを設定し、この一時停止と再開メソッドをコールバックで適切に使用します。また、アプリケーションが必要とするかどうかに基づいて、オーディオセッションをアクティブに設定するよう注意してください。

これは誰かを助けてくれることを願っています。

EDIT:

オーディオ割り込みリスナーコールバック:音声の途切れのリスニング

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) 
{ 
    if (interruptionState == kAudioSessionBeginInterruption) 
    { 
     [self.audioRecorder pause]; 
    } 
    else if (interruptionState == kAudioSessionEndInterruption) 
    { 
     // if the interruption was removed, and the app had been recording, resume recording 
     [self.audioRecorder resume]; 
    } 
} 

AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self); 
+0

このアプローチは、アプリケーションが終了してリロードしても既存のファイルからの録音を再開できますか? – memmons

+0

アプリがバックグラウンドになる前とフォアグラウンドになる前に、-pauseおよび-resume APIを適切に呼び出すと、アプリケーションが終了してリロードされても、フォアグラウンドになると再開しません。 –

+0

録音プロセス全体にAudioQueuesを使用しましたか? – Siddharth