UISlider在MPMusicPlayerController中不能正常工作iPhone
问题描述:
我编程的新手我已经在使用MPMusicPlayerController的i-phone中制作了一个音乐播放器,我可以实现这一点,但是我一直在播放时拖动音频文件。 我已经使用OBSLIDER来实现这一点。一切工作正常,但它不像苹果默认Player.Below是我已经使用的代码。 请帮我解决这个问题。UISlider在MPMusicPlayerController中不能正常工作iPhone
-(IBAction)sliderChanged:(id)sender
{
//player is object of MPMusicPlayerController
//total seconds is total length of song that is playing in player
if(self.slider.value<totalseconds)
{
[playbackTimer invalidate];
[self.player setCurrentPlaybackTime:slider.value];
NSNumberFormatter *percentFormatter = [[NSNumberFormatter alloc] init];
[percentFormatter setNumberStyle:NSNumberFormatterPercentStyle];
self.labelScrubbing.text = [NSString stringWithFormat:@"Scrubbing speed: %@",
[percentFormatter stringFromNumber:[NSNumber numberWithFloat:self.slider.scrubbingSpeed]]];
//to update the time when slider moves
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
float totalDuration=slider.value;
float mins = floor(totalDuration/60);
float secs = round(totalDuration - mins * 60);
int roundedSecs = lroundf(secs);
int roundedMins = lroundf(mins);
dispatch_sync(dispatch_get_main_queue(), ^{
NSString *timeInfoString = [[NSString alloc]
initWithFormat:@"%0d.%02d",
roundedMins, roundedSecs];
currrentDurationSong.text=timeInfoString;
});
});
playbackTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateTime)
userInfo:nil
repeats:YES];
}
else if(self.slider.value>=totalseconds){
}
}
我用计时器来更新剩余时间,这里是该
-(void)updateTime
{
NSTimeInterval currentProgress = self.player.currentPlaybackTime;
self.slider.value = currentProgress;
NSNumberFormatter *percentFormatter = [[NSNumberFormatter alloc] init];
[percentFormatter setNumberStyle:NSNumberFormatterPercentStyle];
self.labelScrubbing.text = [NSString stringWithFormat:@"Scrubbing speed: %@",
[percentFormatter stringFromNumber:[NSNumber numberWithFloat:self.slider.scrubbingSpeed]]];
MPMediaItem *nowPlayingMediaItem = [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem];
NSString* title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle] ;
NSString* artist = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyArtist] ;
NSString* albumname = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyAlbumTitle] ;
NSString *duration=[nowPlayingMediaItem valueForProperty:MPMediaItemPropertyPlaybackDuration];
float totalDuration=[duration floatValue];
float mins = floor(totalDuration/60);
float secs = round(totalDuration - mins * 60);
int roundedSecs = lroundf(secs);
int roundedMins = lroundf(mins);
NSLog(@"%02d",roundedMins);
NSString* _albumString = [[NSString alloc]initWithFormat:@"%@",(albumname.length>0 ? albumname : @"Unknown") ];
NSString* _artistString = [[NSString alloc]initWithFormat:@"%@",(artist.length>0 ? artist : @"Unknown") ];
NSString *timeInfoString = [[NSString alloc]
initWithFormat:@"%0d.%02d",
roundedMins, roundedSecs];
totalDurationSong.text=[NSString stringWithFormat:@"%@",timeInfoString];
titleOfSong.text=title;
ArtistOfSong.text=_artistString;
albumNameofSong.text=_albumString;
float min = floor(currentProgress/60);
float sec = round(currentProgress - min * 60);
int roundedSec = lroundf(sec);
int roundedMin = lroundf(min);
NSString *timeInfoStrings = [[NSString alloc]
initWithFormat:@"%0d.%02d",
roundedMin, roundedSec];
currrentDurationSong.text=[NSString stringWithFormat:@"%@",timeInfoStrings];
if(min+sec==totalseconds){
[playbackTimer invalidate];
}
}
答
我有同样的问题挣扎的代码。问题在于currentPlaybackTime。 currentPlaybackTime限于每秒发送当前时间数据。所以无论定时器循环多快,它只会每秒更新一次滑块。但是,由于您的计时器设置为1秒,因此可能会触发当前播放时间的偏移量(导致一连串口吃)。你可能想加快这样的时间:
playbackTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(updateTime)
userInfo:nil
repeats:YES];
为什么dispatch_async? – Rajneesh071
@ Rajneesh071我也删除了,但它也不像Apple.Python中的默认播放器那样流畅。我已经使用它来让UILabel更新时间。 – ankyy
使用playbackTimer的意思是什么? – Rajneesh071