2009-11-10 27 views
8

Pracuję nad aplikacją nagrywarki dźwięku, działa ona doskonale.jak wznowić nagrywanie po przerwach w iPhone?

Ale utknąłem z problemem przerwania. Gdy przychodzi połączenie, ta metoda jest wywoływana, a nagrywanie jest wstrzymane.

A jeśli użytkownik odrzuca połączenia:

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder 

to tutaj chcę wznowić nagrywanie od punktu, w którym został przerwany. Ale kiedy ponownie zadzwonię do metody nagrywania, nagrywanie rozpoczyna się od nowego pliku.

+0

proszę pisać kod, którego używasz, aby rozpocząć/zatrzymać nagrywanie/pauza. Czy zwalniasz za każdym razem, gdy obiekt AVAudioRecorder tworzy i tworzy nowy? Może to wyjaśniać, dlaczego za każdym razem, gdy rozpoczynasz nagrywanie przy użyciu innego pliku. –

+0

Fyi, Zbudowałem małą przykładową aplikację, która pokazuje, że End Int nie działa poprawnie i zalogował się w tej sprawie z Apple. Jest z nimi przez> 2 miesiące i nic nie słyszałem. – ort11

Odpowiedz

1

System operacyjny prawdopodobnie zatrzymuje AVAudioRecorder podczas przerwania. Możesz albo przedstawić dwa lub więcej plików jako pojedyncze nagranie dla użytkownika, albo możesz użyć AudioQueue do napisania kodu do obsługi przerw (oraz zapisywania danych dźwiękowych do pliku).

0

Próbowałem zrobić to jakiś czas temu i doszedłem do wniosku, że nie można tego zrobić właściwie; sam system operacyjny nie pozwoli ci tego zrobić. Może to zmieniło się w wersji 3.1.2, ale kiedy spróbowałem w wersji 3.0, to po prostu by nie działało.

0

do obsługi przerwania, trzeba użyć AVAudioSessionDelegate methodes zamiast AVAudioRecorderDelegate methods.This jest przykładowy kod do obsługi przerwania:

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

Pierwsza metoda automatycznego wyłączania dźwięku session.So, w drugim sposobie, musisz ponownie aktywować sesję audio. Pierwsza metoda zatrzyma nagrywanie, a gdy przerwa zostanie przerwana, możesz wznowić drugą metodę. Próbowałem tego w wersji 3.0 i wyższej.

6

Problem został rozwiązany!

Ponownie zapisałem kod nagrywania, aby uniknąć tego problemu. Użyłem AudioQueues, zasadniczo kod backendu jest taki sam dla aplikacji SpeakHere z niewielkimi zmianami. Dostarczono jeszcze dwa apisy:

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

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

W klasie AudioRecorder. Podstawowym celem jest uniknięcie ustawienia nagrywania, które odbywa się metodą rekordową.

Skonfiguruj wywołanie zwrotne przerwania, a następnie użyj tej funkcji wstrzymania i wznów metody odpowiednio w wywołaniu zwrotnym. Należy również ustawić aktywację sesji audio na podstawie tego, czy aplikacja tego potrzebuje, czy nie.

Mam nadzieję, że to komuś pomaga.

EDIT:

audio przerwania słuchacz zwrotna:

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

Nasłuchiwanie przerwy dźwięku:

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

Czy to podejście jest w stanie wznowić nagrywanie z istniejącego pliku, nawet jeśli aplikacja wychodzi i ładuje się ponownie? – memmons

+0

Nie, jeśli wychodzi i ponownie ładuje, ale tak, wznawia się, gdy aplikacja pojawia się na pierwszym planie, gdy wywołasz funkcję -pause i -resume API odpowiednio, zanim aplikacja przejdzie do tła i po przejściu na pierwszy plan. –

+0

Czy korzystałeś z AudioQueues dla całego procesu nagrywania? – Siddharth