我想在Spotify啓用的應用程序中從一條曲目交叉淡入到下一條曲目。這兩條曲目都是Spotify曲目,並且由於Spotify一次只能有一個數據流,所以我懷疑我需要在第一首曲目的最後幾秒緩衝(我想我可以提前讀取1.5倍的播放速度),然後開始播放流對於第二首曲目,使用AudioUnit淡入淡出。如何使用cocoalibspotify音頻交叉淡入淡出?
我查看示例應用程序: 萬歲 - https://github.com/iKenndac/Viva SimplePlayer與EQ - https://github.com/iKenndac/SimplePlayer-with-EQ並試圖讓我的腦海裏圍繞SPCircularBuffer,但我仍然需要幫助。有人能指點我另一個例子嗎?或者幫助子彈點軌道交叉淡入淡出遊戲計劃?
更新:感謝iKenndac,我在那裏95%左右。我會後我到目前爲止有:
在SPPlaybackManager.m:initWithPlaybackSession:(SPSession *)aSession {
補充說:
self.audioController2 = [[SPCoreAudioController alloc] init];
self.audioController2.delegate = self;
和
- (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;
和添加了基於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);
}
}];
}
此開始用於淡入淡出
crossfadeTimer = [的NSTimer scheduledTimerWithTimeInterval:0.5 目標:自 選擇器:@selector(crossfadeCountdown) USERINFO:無 重複:YES]定時器;
而且爲了保持第一播放曲目的數據SPCoreAudioController.m加載之後我改變了目標緩衝區長度:
static NSTimeInterval const kTargetBufferLength = 20;
和SPSession.m:音軌結尾(sp_session *會話){
我除去
// sess.playing = NO;
我請preloadTrackForPlayback:軌道的端部約15秒之前,然後crossfadeTrack:在之前10秒。
然後設置crossfadeCountdownTime = [您想要交叉淡入淡出多少秒] * 2;
我褪色與成交量較crosssfade:
- (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];
}
}
我會繼續做這個工作,和更新,如果我可以做的更好。再次感謝iKenndac提供的幫助!
我試圖在CocoaLibSpotify中實現交叉淡入淡出功能,目前我堅持最後一步,淡入淡出音頻控制器的音量。你能否詳細說明你是如何做到的? – 2015-01-01 17:09:44