2009-11-10 6 views
8

Ich arbeite an einer Audio-Recorder-Anwendung, es funktioniert einwandfrei.Wie kann ich die Aufnahme nach einer Unterbrechung im iPhone fortsetzen?

Aber ich bin mit dem Problem der Unterbrechung fest. Wenn ein Anruf kommt, wird diese Methode aufgerufen und die Aufzeichnung angehalten.

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder 

dann wird die Aufzeichnung angehalten.

Und wenn der Benutzer weist den Anruf:

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder 

Dann hier möchte ich die Aufnahme von dem Punkt fortzusetzen, an der sie unterbrochen wurde. Aber wenn ich die Record-Methode erneut aufrufen, beginnt die Aufnahme mit einer neuen Datei.

+0

Bitte senden Sie den Code Sie verwenden/Stop/Pause Aufnahme zu starten. Wird jedes Mal das AVAudioRecorder-Objekt freigegeben und ein neues erstellt? Dies erklärt möglicherweise, warum Sie jedes Mal mit einer anderen Datei aufnehmen. –

+0

Fyi, ich habe eine kleine Beispiel-App gebaut, die zeigt, wie das Ende Int nicht richtig funktioniert und einen Anruf mit Apple zu diesem Problem protokolliert hat. Es ist seit über 2 Monaten bei ihnen und hat nichts gehört. – ort11

Antwort

1

Das Betriebssystem stoppt wahrscheinlich den AVAudioRecorder während der Unterbrechung. Sie können dem Benutzer entweder die zwei oder mehr Dateien als eine einzelne Aufnahme präsentieren oder Sie können AudioQueue verwenden, um Ihren Code für die Behandlung von Unterbrechungen zu schreiben (sowie Audiodaten in eine Datei zu speichern).

0

Ich habe vor einer Weile versucht, dies zu tun und kam zu dem Schluss, dass es nicht richtig gemacht werden konnte; Das Betriebssystem selbst lässt es nicht zu. Vielleicht hat sich das in 3.1.2 geändert, aber wenn ich es in 3.0 probiert habe, würde es einfach nicht funktionieren.

0

der Unterbrechung zu verarbeiten, haben Sie AVAudioSessionDelegate methodes statt AVAudioRecorderDelegate methods.This wird der Code-Beispiel verwenden Unterbrechung für den Umgang:

/*================================================================= 
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 
} 

Erste Methode automatisch die Audio-session.So deaktivieren, in der zweiten Methode, Sie müssen die Audio-Sitzung erneut aktivieren. Die erste Methode wird die Aufzeichnung anhalten und wenn die Unterbrechung endet, können Sie mit der zweiten Methode fortsetzen. Ich habe dies in Version 3.0 und höher Version versucht.

6

Das Problem ist gelöst!

Ich habe den Aufzeichnungscode neu geschrieben, um dieses Problem zu vermeiden. Ich habe AudioQueues verwendet, im Grunde ist der Backend-Code der selbe der SpeakHere-Anwendung mit einigen kleineren Änderungen. Bereitgestellt zwei weitere Apis darin:

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

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

In AudioRecorder Klasse. Der grundlegende Zweck besteht darin, den Aufzeichnungsaufbau zu vermeiden, der in der Aufzeichnungsmethode durchgeführt wird.

Richten Sie den Interrupt-Callback ein und verwenden Sie dann diese Pause und setzen Sie die Methoden im Callback entsprechend fort. Achten Sie auch darauf, die Audiositzung basierend darauf einzustellen, ob Ihre Anwendung dies benötigt oder nicht.

Hoffe das hilft jemand da draußen.

EDIT:

Audio Interrupt Zuhörer Rückruf:

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

für Audio-Unterbrechung hören:

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

Kann dieser Ansatz die Aufzeichnung von einer vorhandenen Datei fortsetzen, selbst wenn die Anwendung beendet und neu geladen wird? – memmons

+0

Nicht, wenn beendet und erneut geladen wird, aber ja, es wird fortgesetzt, wenn die App in den Vordergrund kommt, wenn Sie die APIs -pause und -resize aufrufen, bevor Ihre App in den Hintergrund und in den Vordergrund gelangt. –

+0

Haben Sie AudioQueues für den gesamten Aufnahmeprozess verwendet? – Siddharth

Verwandte Themen