Chciałbym przechodzić z jednego utworu do następnego w aplikacji obsługującej Spotify. Obie ścieżki są ścieżkami Spotify, a ponieważ tylko jeden strumień danych może pochodzić ze Spotify, podejrzewam, że potrzebuję bufora (myślę, że mogę odczytać prędkość odtwarzania 1,5 x) w ciągu ostatnich kilku sekund pierwszego utworu, rozpocząć strumień na ścieżce drugiej, wycisz jedną i zaniknij na dwie używając AudioUnit.Jak przeskakiwać dźwięk za pomocą cocoalibspotify?
Sprawdziliśmy Przykładowe aplikacje: Viva - https://github.com/iKenndac/Viva SimplePlayer z EQ - https://github.com/iKenndac/SimplePlayer-with-EQ i starał się dostać mój umysł wokół SPCircularBuffer, ale nadal potrzebują pomocy. Czy ktoś może wskazać mi inny przykład lub pomóc punktowi informacyjnemu planu przeniesienia trasy?
Aktualizacja: Dzięki iKenndac, mam około 95%. będę pisać co mam tak daleko:
w SPPlaybackManager.m: initWithPlaybackSession: (SPSession *) aSession {
dodania:
self.audioController2 = [[SPCoreAudioController alloc] init];
self.audioController2.delegate = self;
oraz w
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
...
self.audioController.audioOutputEnabled = self.playbackSession.isPlaying;
// for crossfade, add
self.audioController2.audioOutputEnabled = self.playbackSession.isPlaying;
i dodano nową metodę opartą na playTrack
-(void)crossfadeTrack:(SPTrack *)aTrack callback:(SPErrorableOperationCallback)block {
// switch audiocontroller from current to other
if (self.playbackSession.audioDeliveryDelegate == self.audioController)
{
self.playbackSession.audioDeliveryDelegate = self.audioController2;
self.audioController2.delegate = self;
self.audioController.delegate = nil;
}
else
{
self.playbackSession.audioDeliveryDelegate = self.audioController;
self.audioController.delegate = self;
self.audioController2.delegate = nil;
}
if (aTrack.availability != SP_TRACK_AVAILABILITY_AVAILABLE) {
if (block) block([NSError spotifyErrorWithCode:SP_ERROR_TRACK_NOT_PLAYABLE]);
self.currentTrack = nil;
}
self.currentTrack = aTrack;
self.trackPosition = 0.0;
[self.playbackSession playTrack:self.currentTrack callback:^(NSError *error) {
if (!error)
self.playbackSession.playing = YES;
else
self.currentTrack = nil;
if (block) {
block(error);
}
}];
}
ten uruchamia czasomierz dla przenikania
crossfadeTimer = [NSTimer scheduledTimerWithTimeInterval 0,5 cel: bez selektora: @selector (crossfadeCountdown) userinfo: zerowe powtórzeń: TAK];
A w celu utrzymania pierwszego odtwarzanie utworu po jego załadowaniu danych w SPCoreAudioController.m Zmieniłem długość docelowy bufor:
static NSTimeInterval const kTargetBufferLength = 20;
aw SPSession.m: end_of_track (sp_session * session) {
I usunięte
// sess.playing = NO;
zgłoszę preloadTrackForPlayback: około 15 sekund przed końcem toru, crossfadeTrack: co 10 sekund.
Następnie ustaw crossfadeCountdownTime = [ile sekund chcesz przenikania] * 2;
I znikną głośność nad crosssfade z:
- (void) crossfadeCountdown
{
[UIAppDelegate.playbackSPManager setVolume:(1- (((float)crossfadeCountdownTime/ (thisCrossfadeSeconds*2.0)) *0.2))];
crossfadeCountdownTime -= 0.5;
if (crossfadeCountdownTime == 1.0)
{
NSLog(@"Crossfade countdown done");
crossfadeCountdownTime = 0;
[crossfadeTimer invalidate];
crossfadeTimer = nil;
[UIAppDelegate.playbackSPManager setVolume:1.0];
}
}
będę nad nim i aktualizacji, czy mogę zrobić to lepiej. Jeszcze raz dziękuję iKenndac za jego zawsze pomoc bezpośrednią!
Próbuję zaimplementować funkcję przenikania w CocoaLibSpotify i obecnie utknąłem w ostatnim kroku, zmniejszając głośność obu kontrolerów audio. Czy mógłbyś wyjaśnić, w jaki sposób udało ci się to zrobić? –