2012-06-25 6 views
10

Ich habe eine iOS-App, die mit einem AVPlayer einen Hintergrundsoundtrack spielt und andere Soundclips mit einem zweiten AVPlayer "on top" abspielt. (Die Soundclips werden aus dem Internet gestreamt, daher die Voraussetzung für AVPlayer.) Das Problem ist, dass der zweite AVPlayer beim Abspielen des zweiten AVPlayers den Hintergrund-AVPlayer für einen Bruchteil einer Sekunde stoppt, ähnlich wie in diesem Kommentar beschrieben:Audiofehler bei der gleichzeitigen Wiedergabe von zwei AVPlayer-Audiodateien

Play multiple Audio Files with AVPlayer


ich bereite die Audio-Clips mit dieser Methode:

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

... und dann [player play]; Aufruf, wenn ich w ant, um jeden Ton zu hören.


Gibt es etwas, das ich zu tun, wenn ich die Audio-Sitzung oder jede Instanz des AVPlayer eingerichtet, so dass die Töne ohne den Glitch mischen?

Antwort

2

Dies ist wahrscheinlich auf den Software-Encoder zurückzuführen. Sie werden einen ziemlich großen Spike im Speicher sehen, wenn der Software-Encoder versucht, den zweiten Soundclip abzuspielen. Werfen Sie einen Blick auf den Apfel docs Abschnitt „iOS Hardware und Software Audio Codecs“ http://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html

„Als Hardware-unterstützte Decodierung verwendet wird, kann das Gerät nur eine einzige Instanz eines der unterstützten Formate zu einem Zeitpunkt, spielen.“

Auch ... "Um mehrere Sounds mit bester Performance abzuspielen oder um Sounds effizient abzuspielen, während der iPod im Hintergrund abgespielt wird, verwenden Sie Linear PCM (unkomprimiert) oder IMA4 (komprimiertes) Audio."

Wenn Sie keine Wahl haben in den Media-Codecs, die Sie bereitstellen können, werfen Sie einen Blick auf das AudioUnit-Framework, um eine nahtlose Mischung zu erhalten. Insbesondere der "Audio Mixer (MixerHost)" unter http://developer.apple.com/library/ios/#samplecode/MixerHost/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010210

+0

Das kann nicht sein. Ich habe einige Experimente mit unverpackten PCM-Dateien durchgeführt, und das Problem besteht weiterhin. Davon abgesehen scheint es etwas mit der Anwendung von AVMutableAudioMix zu tun zu haben. Wann immer es angewendet wird, passiert das Bommel. –

1

Ich habe endlich herausgefunden, was das Problem ist. Ich schreibe eine Anwendung, in der ich die Lautstärke mit der AVMutableAudioMixInputParameters-Klasse anpasse, und ich versuche, Audio mit dieser Klasse zu normalisieren, indem ich die Lautstärke pro Sample nach oben oder unten verschiebe.

Während dieser Ansatz funktioniert, wenn es nur ein paar Lautstärke Rampen gibt, scheint es, dass die Anwendung der Rampen auf dem gleichen Thread passiert, der das Audio puffert, also wenn ich zu viele (~ ~ 1000) davon verwende verschlingt schließlich die CPU, die beschäftigt sein sollte, Audio zu puffern, und dann hast du einen ggg-Störschub im Audio.

Meine Lösung bestand darin, meinen Algorithmus zur Volumennormalisierung zu refaktorieren, um weniger Volumenrampen zu verwenden, um dasselbe zu erreichen. Sobald ich in der Lage war, jeden Satz von Lautstärke-Ramps/Song auf etwa 500 herunterzufahren, hatte ich das Problem nicht mehr, und der Audio-Fehler verschwand.

Verwandte Themen