Soundcloud应用程序如何快速跳到下一首曲目?(How does Soundcloud app skip to next track so fast?)

编程入门 行业动态 更新时间:2024-10-26 06:37:05
Soundcloud应用程序如何快速跳到下一首曲目?(How does Soundcloud app skip to next track so fast?)

我正在构建我的第一个应用程序,它是一个Soundcloud客户端。 现在,每次选择播放曲目时,我都必须继续进行NSURLSessionDataTask获取以获取二进制数据,但这需要很长时间。 当我跳到下一首曲目时,我必须在播放当前歌曲时提前输入逻辑以下载下一首歌曲...但是,如果用户快速跳过,这仍然很慢:/

Soundcloud本机应用程序立即跳过。 它是如何工作的? 我尝试过使用Soundcloud iOS SDK,但现在已弃用。

这是我的歌曲获取:

-(void)fetchTrack: (SCTrack*)selectedTrack completionHandler: (void(^)(NSData *trackData, NSString *error)) completionHandler; { NSString* clientID = @"41a5278fd8c704c3eb5a4a0ca38f9036"; NSString* streamURL = selectedTrack.stream_url; NSString* urlString = [NSString stringWithFormat:@"%@?client_id=%@", streamURL, clientID]; NSURL* url = [[NSURL alloc]initWithString:urlString]; NSLog(@"%@", urlString); NSMutableURLRequest* request = [[NSMutableURLRequest alloc]initWithURL:url]; request.HTTPMethod = @"GET"; NSURLSessionDataTask* dataTask = [[self session] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse* callResponse = (NSHTTPURLResponse*)response; if ([callResponse isKindOfClass:[NSHTTPURLResponse class]]) { NSInteger responseCode = [callResponse statusCode]; if (responseCode >= 200 && responseCode <= 299) { NSData* trackData = data; NSLog(@"STREAM 200"); [[NSOperationQueue mainQueue]addOperationWithBlock:^{ NSLog(@"%@", data); completionHandler(trackData, nil); }]; }else{ NSLog(@"%ld", (long)responseCode); } } }]; [dataTask resume]; }

这就是我正在播放并尝试在当前曲目播放时获取下一首歌曲的方式:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { self.selectedTrack = self.SCTrackList[indexPath.row]; self.selectedTrackRow = indexPath.row; [[SoundCloudAPI sharedInstance]fetchTrack:self.selectedTrack completionHandler:^(NSData *trackData, NSString *error) { self.player = [[AVAudioPlayer alloc]initWithData: trackData error:nil]; [self.player prepareToPlay]; [self.player play];; }]; [self prepareForNextTrack:self.selectedTrack]; } -(void)prepareForNextTrack: (SCTrack*)trackPlaying { self.selectedTrackRow += 1; self.selectedTrack = self.SCTrackList[self.selectedTrackRow]; [[SoundCloudAPI sharedInstance]fetchTrack:self.selectedTrack completionHandler:^(NSData *trackData, NSString *error) { self.trackDataToPlay = trackData; }]; } - (IBAction)nextPressed:(id)sender { self.player = [[AVAudioPlayer alloc]initWithData: self.trackDataToPlay error:nil]; [self.player prepareToPlay]; [self.player play];; [self prepareForNextTrack:self.selectedTrack]; }

另外,我是新手,所以我确信我的代码非常笨重,如果有人能指出改进的方法,我会很感激。

谢谢你指出了正确的方向!

I'm building my first app and it's a Soundcloud client. Right now, everytime a track is selected to play, I have to go on and do a NSURLSessionDataTask fetch to get the binary data, but this takes a long time. And when I skip, to the next track, I have to add the logic in to download the next song ahead of time when the current song is playing...though, this is still slow if the user skips quickly:/

The Soundcloud native app skips instantly. How do it work? I've tried using Soundcloud iOS SDK but it is now deprecated.

Here is my song fetch:

-(void)fetchTrack: (SCTrack*)selectedTrack completionHandler: (void(^)(NSData *trackData, NSString *error)) completionHandler; { NSString* clientID = @"41a5278fd8c704c3eb5a4a0ca38f9036"; NSString* streamURL = selectedTrack.stream_url; NSString* urlString = [NSString stringWithFormat:@"%@?client_id=%@", streamURL, clientID]; NSURL* url = [[NSURL alloc]initWithString:urlString]; NSLog(@"%@", urlString); NSMutableURLRequest* request = [[NSMutableURLRequest alloc]initWithURL:url]; request.HTTPMethod = @"GET"; NSURLSessionDataTask* dataTask = [[self session] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse* callResponse = (NSHTTPURLResponse*)response; if ([callResponse isKindOfClass:[NSHTTPURLResponse class]]) { NSInteger responseCode = [callResponse statusCode]; if (responseCode >= 200 && responseCode <= 299) { NSData* trackData = data; NSLog(@"STREAM 200"); [[NSOperationQueue mainQueue]addOperationWithBlock:^{ NSLog(@"%@", data); completionHandler(trackData, nil); }]; }else{ NSLog(@"%ld", (long)responseCode); } } }]; [dataTask resume]; }

This is how I'm playing and attempting to fetch the next song while the current track is playing:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { self.selectedTrack = self.SCTrackList[indexPath.row]; self.selectedTrackRow = indexPath.row; [[SoundCloudAPI sharedInstance]fetchTrack:self.selectedTrack completionHandler:^(NSData *trackData, NSString *error) { self.player = [[AVAudioPlayer alloc]initWithData: trackData error:nil]; [self.player prepareToPlay]; [self.player play];; }]; [self prepareForNextTrack:self.selectedTrack]; } -(void)prepareForNextTrack: (SCTrack*)trackPlaying { self.selectedTrackRow += 1; self.selectedTrack = self.SCTrackList[self.selectedTrackRow]; [[SoundCloudAPI sharedInstance]fetchTrack:self.selectedTrack completionHandler:^(NSData *trackData, NSString *error) { self.trackDataToPlay = trackData; }]; } - (IBAction)nextPressed:(id)sender { self.player = [[AVAudioPlayer alloc]initWithData: self.trackDataToPlay error:nil]; [self.player prepareToPlay]; [self.player play];; [self prepareForNextTrack:self.selectedTrack]; }

Also, I'm new, so I'm sure my code is pretty clunky and would appreciated if anyone can point out ways to improve.

Thanks for pointing in the right direction!

最满意答案

因此,我变得比以往更复杂。 我所要做的就是使用dataWithContentsOfURL方法来检索在令牌中传递的歌曲。

NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?oauth_token=%@",self.selectedTrack.stream_url, self.token]]];

当然,将数据放在AVAudioPlayer中。

基本上,摆脱我上面的fetchTrack函数。

So it turns I made things wayyyy more complicated than had to be. All I had to do was the dataWithContentsOfURL method to go retrieve the song passing in the token.

NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?oauth_token=%@",self.selectedTrack.stream_url, self.token]]];

And of course, put the data in the AVAudioPlayer.

Basically, getting rid of my fetchTrack function above.

更多推荐

本文发布于:2023-07-25 10:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1260053.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:一首   跳到   曲目   应用程序   快速

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!