2012-06-25 9 views
10

Mam aplikację na iOS, która odtwarza podkład dźwiękowy w tle z jednym odtwarzaczem AVPlayer i odtwarza inne klipy dźwiękowe "na wierzchu" za pomocą drugiego odtwarzacza AVPlayer. (Klipy dźwiękowe są przesyłane strumieniowo z Internetu, stąd wymagania dla AVPlayera.) Problem polega na tym, że kiedy drugi AVPlayer zaczyna grać, powoduje to zatrzymanie AVPlayer'a tła na ułamek sekundy, podobnie jak opisano w tym komentarzu:Zakłócenie dźwięku podczas jednoczesnego odtwarzania dwóch plików dźwiękowych AVPlayer

Play multiple Audio Files with AVPlayer


jestem przygotowanie klipów audio z tą metodą:

- (void)prepareAudio:(NSURL *)assetURL { 

asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 
playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
[player replaceCurrentItemWithPlayerItem:playerItem]; 


[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil]; 
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[player currentItem]]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemFailedToReachEnd:) 
              name:AVPlayerItemFailedToPlayToEndTimeNotification 
              object:[player currentItem]]; 
} 

... a następnie powołując [player play]; kiedy wagowo mrówka, aby usłyszeć każdy dźwięk.


Czy jest coś, co muszę zrobić, gdy skonfigurować sesję audio lub każdą instancję AVPlayer, tak że dźwięki mieszają bez usterki?

Odpowiedz

2

Jest to prawdopodobnie spowodowane pobudzaniem programowego kodera. Zobaczysz dość duży skok w pamięci, gdy programowy koder spróbuje odtworzyć drugi klip dźwiękowy. Spójrz na odcinku docs Apple „iOS sprzętu i oprogramowania Kodeki audio” http://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html

„Podczas używania dekodowania sprzętowego wspomaganiem, urządzenie może odtwarzać tylko jedno wystąpienie jednej z obsługiwanych formatów w tym samym czasie.”

Również ... "Aby odtwarzać wiele dźwięków z najlepszą wydajnością lub wydajnie odtwarzać dźwięki podczas odtwarzania iPoda w tle, użyj liniowego dźwięku PCM (nieskompresowanego) lub IMA4 (skompresowanego)."

Jeśli nie masz wyboru w kodekach multimediów, które możesz podać, spójrz na strukturę AudioUnit, aby uzyskać bardziej płynne miksowanie. W szczególności "Audio Mixer (MixerHost)" pod http://developer.apple.com/library/ios/#samplecode/MixerHost/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010210

+0

To nie może być to. Zrobiłem kilka eksperymentów przy użyciu prostych nieskompresowanych plików PCM, a problem nadal istnieje. W związku z tym wydaje się, że ma to coś wspólnego z aplikacją AVMutableAudioMix. Ilekroć zostanie zastosowany, wtedy dzieje się bobble. –

1

W końcu zorientowałem się, na czym polega problem. Piszę aplikację, w której reguluję głośność za pomocą klasy AVMutableAudioMixInputParameters, a ja próbuję znormalizować dźwięk za pomocą tej klasy, przesuwając głośność w górę lub w dół dla poszczególnych próbek.

Chociaż to podejście działa, gdy jest tylko kilka ramp dla woluminów, wydaje się, że zastosowanie ramp odbywa się w tym samym wątku, który buforuje dźwięk, więc gdy używam ich zbyt wiele (> ~ 1000), w końcu zużywa procesor, który powinien być zajęty buforowaniem dźwięku, a następnie masz ggg-glitch w dźwięku.

Moje rozwiązanie polegało na zmianie mojego algorytmu normalizacji objętości w celu wykorzystania mniejszej liczby ramp dla uzyskania tego samego. Kiedy udało mi się uzyskać każdy zestaw ramp/utworu z głośnością do około 500 lub więcej, nie miałem już problemu, a usterka audio odeszła.