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]; 
    } 


} 
+0

为什么dispatch_async? – Rajneesh071

+0

@ Rajneesh071我也删除了,但它也不像Apple.Python中的默认播放器那样流畅。我已经使用它来让UILabel更新时间。 – ankyy

+0

使用playbackTimer的意思是什么? – Rajneesh071

我有同样的问题挣扎的代码。问题在于currentPlaybackTime。 currentPlaybackTime限于每秒发送当前时间数据。所以无论定时器循环多快,它只会每秒更新一次滑块。但是,由于您的计时器设置为1秒,因此可能会触发当前播放时间的偏移量(导致一连串口吃)。你可能想加快这样的时间:

playbackTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 
                 target:self 
                 selector:@selector(updateTime) 
                 userInfo:nil 
                 repeats:YES];