Ich möchte in einer Spotify-fähigen App von einer Spur zur nächsten überblenden. Beide Tracks sind Spotify-Tracks, und da immer nur ein Datenstrom von Spotify kommen kann, vermute ich, dass ich die letzten paar Sekunden des ersten Tracks puffern muss (ich denke, ich kann 1,5 x Wiedergabegeschwindigkeit vorauslesen), starte den Stream für Spur zwei, blenden Sie eine aus und blenden Sie zwei mit einer AudioUnit ein.Wie überspiele ich Audio mit Cocoalibspotify?
Ich habe überprüft Beispielanwendungen: Viva - https://github.com/iKenndac/Viva SimplePlayer mit EQ - https://github.com/iKenndac/SimplePlayer-with-EQ und versuchte, meinen Kopf um die SPCircularBuffer zu bekommen, aber ich brauche noch Hilfe. Könnte mich jemand auf ein anderes Beispiel hinweisen oder helfen, einen Track Crossfade-Spielplan aufzuschreiben?
Update: Dank iKenndac bin ich etwa 95% dort. Ich werde schreiben, was ich habe, so weit:
in SPPlaybackManager.m: initWithPlaybackSession: (SPSession *) session {
hinzugefügt:
self.audioController2 = [[SPCoreAudioController alloc] init];
self.audioController2.delegate = self;
und in
- (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;
und eine neue Methode basierend auf playTrack hinzugefügt
-(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);
}
}];
}
Dies startet einen Zeitgeber für die Überblendung
crossfadeTimer = [NSTimer scheduledTimerWithTimeInterval: 0,5 Ziel: Selbst selector: @selector (crossfadeCountdown) userinfo: nil repeats: JA];
Und um den ersten Titel zu spielen, nachdem seine Daten in SPCoreAudioController.m geladen ist zu halten, änderte ich Zielpufferlänge:
static NSTimeInterval const kTargetBufferLength = 20;
und in SPSession.m: End_of_Track (sp_session * Sitzung) {
I entfernt
// sess.playing = NO;
ich nenne preloadTrackForPlayback: etwa 15 Sekunden vor dem Ende der Spur, dann crossfadeTrack: 10 Sekunden vor an.
Dann setzen Sie crossfadeCountdownTime = [wie viele Sekunden möchten Sie die Überblendung] * 2;
ich verblassen Volumen über die crosssfade mit:
- (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];
}
}
ich daran halten werde arbeiten, und zu aktualisieren, wenn ich es besser machen kann. Vielen Dank nochmal an iKenndac für seine immer aktuelle Hilfe!
Ich versuche, die Crossfade-Funktionalität in CocoaLibSpotify zu implementieren und bin derzeit im letzten Schritt stecken, verblasst die Lautstärke beider AudioController. Könnten Sie näher erläutern, wie Sie das geschafft haben? –