2009-11-11 4 views
5

Mam aplikację na iPhone z krótkim intro wideo. Jeśli użytkownik uruchomi aplikację, gdy iPod odtwarza muzykę, muzyka zatrzyma się podczas odtwarzania wideo (niezależnie od tego, czy dźwięk ma dźwięk), a dźwięk zostanie trwale zatrzymany po odtworzeniu wideo. Apple wydaje się wskazywać, że możesz rozwiązać ten problem za pomocą sztuczek AudioSession: http://www.devworld.apple.com/iphone/library/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/WorkingWithOpenALiPodMusicandMovies/WorkingWithOpenALiPodMusicandMovies.htmlMPMoviePlayerController zatrzymuje odtwarzanie iPoda i nie uruchamia się ponownie.

Ale ich sugestie po prostu nie działają; wygląda na to, że MPMoviePlayerController nadpisuje konfigurację sesji audio dla własnych celów. Najlepiej byłoby, gdyby miksowałem dźwięk z filmu na iPodzie, a może używałem efektu kaczki, ale nawet ponowne uruchomienie muzyki może być łatwa do naprawienia. Jakieś pomysły?

+0

Wystarczy krótki komentarz: wysyłanie e-maili do iz Apple wydaje się wskazywać, że jest to prawdopodobnie błąd po stronie Apple'a i nie znają żadnego sposobu rozwiązania tego konkretnego problemu. :( – jexe

+0

Jakieś aktualizacje od Apple? Natknąłem się na ten numer teraz –

+0

dokument, który został przez ciebie połączony, odnosi się do dostępu do biblioteki iPoda z twojej aplikacji, podczas gdy zaznaczyłeś, że chcesz miksować muzykę z muzyką pochodzącą z Aplikacja na iPoda - to zupełnie co innego –

Odpowiedz

1

Możesz mieć tylko jedną aplikację do udostępniania muzyki w dowolnym momencie i wiele źródeł (krótkich) dźwięków. Jeśli aplikacja działająca w tle odtwarza muzykę, aplikacja może nakładać się na krótkie dźwięki. Jeśli chcesz odtwarzać muzykę, aplikacja w tle musi zostać zatrzymana.

Nie sądzę, że to, co próbujesz osiągnąć, jest możliwe dzięki MPMoviePlayerController (lub dowolnym wysokopoziomowym frameworiom audio). Możesz być w stanie nałożyć ścieżkę dźwiękową filmu, jeśli jest wystarczająco krótka, ale MPMoviePlayerController prawdopodobnie nie jest do tego dobra.

+0

To nieprawda, jest to możliwe zgodnie z dokumentacja, i możliwe w nowej, poprawionej wersji, o której nie mogę mówić, i zasadniczo potwierdziłem teraz sam z Apple, że to błąd po ich stronie: –

+0

Czy możesz wysłać przykład? Podziękowania –

+0

Jeśli mówisz o dokumencie połączonym z @Jexe nie odnosi się do aplikacji na iPoda, ale do biblioteki iPoda, która pozwala na więcej opcji miksowania. Nie widzę błędu Strona Apple tutaj. –

2

Znalazłem świetne rozwiązanie. W pliku .h musisz utworzyć BOOL o nazwie "wasPlaying". Przed rozpoczęciem odtwarzania wideo pytasz iPoda, czy gra.

if ([[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying) 
{ 
    NSLog(@"Music was playing, lets put YES to the bool"); 
    wasPlaying = YES; 
} 

Następnie po powiesz odtwarzacz filmowy do gry, możesz zadzwonić pod następujące:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedPlaying) name:MPMoviePlayerPlaybackDidFinishNotification object: moviePlayer]; 

A potem, w finishedPlaying metoda:

if (wasPlaying ==YES) 
{ 
    NSLog(@"Music was playing, lets play music again"); 
    [[MPMusicPlayerController iPodMusicPlayer] play]; 
} 

Dla mnie to działało w porządku!

+0

To nie działa, jeśli jest to aplikacja innej firmy zainstalowana z AppStore. Nie można wznowić. Jakieś rozwiązanie? – honcheng

+0

To zadziałało dla mnie podczas testowania na urządzeniu. Czy próbowałeś w swoim? –

2

myślę, że można to zrobić poprzez inicjowanie sesji dźwięku podobnego do tego:

NSError *audioSessionError = nil; 
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
[audioSession setCategory:AVAudioSessionCategoryAmbient 
          error:&audioSessionError] == YES) 

Potem, gdy chcesz użyć sesji dźwięku można ustawić iPoda audio do kaczki ścieżkę wideo:

AudioSessionInitialize (NULL, NULL, NULL, NULL); 
OSStatus propertySetError = 0; 
UInt32 allowMixing = true; 
propertySetError |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(allowMixing), &allowMixing); 
AudioSessionSetActive(YES);