如何将UISlider添加到AVPlayer中

3

我想在我的播放器中添加UISlider,以便在使用AVPlayer播放音频时实现快进。当第一首歌曲播放完毕后,UISlider将返回原始位置并开始播放下一首歌曲。如果有人能帮助我,我将不胜感激。这是我的代码。

-(IBAction)goToiPodLibrary:(UIButton *)sender
{

    // Create picker view
    MPMediaPickerController* picker = [[MPMediaPickerController alloc] init];
    picker.delegate = self;

    if (userMediaItemCollection) {

        MusicTableViewController *controller = [[MusicTableViewController alloc] initWithNibName: @"MusicTableView" bundle: nil];
        controller.delegate = self;

        controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

        [self presentModalViewController: controller animated: YES];

        // else, if no music is chosen yet, display the media item picker
    } else {

        MPMediaPickerController *picker =
        [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic];

        picker.delegate                     = self;
        picker.allowsPickingMultipleItems   = YES;
        picker.prompt                       = NSLocalizedString (@"Add songs to play", "Prompt in media item picker");

        // The media item picker uses the default UI style, so it needs a default-style
        //      status bar to match it visually
        [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleDefault animated: YES];

        [self presentModalViewController: picker animated: YES];
    }

}



-(IBAction)playButtonPressed:(UIButton *)sender
{
    [myPlayer play];
}


-(IBAction)pauseButtonPressed:(UIButton *)sender
{
    [myPlayer pause];
}


-(void) mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker {

    // Dismiss selection view
    [self dismissViewControllerAnimated:YES completion:nil];

}

-(void) mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {

    // Dismiss selection view
    [self dismissViewControllerAnimated:YES completion:nil];

    // Get AVAsset
    NSURL* assetUrl = [mediaItemCollection.representativeItem valueForProperty:MPMediaItemPropertyAssetURL];
    AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetUrl options:nil];

    // Create player item
    AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];



    // Play it
    myPlayer = [AVPlayer playerWithPlayerItem:playerItem];

    [playlistSongsArray addObjectsFromArray:mediaItemCollection.items];

    NSLog(@" Playlist songs  %@",playlistSongsArray);

    [self.myPlaylistTable reloadData];

    [myPlayer play];

}
4个回答

18
- (void)sliderValueChanged:(id)sender {
    CMTime newTime = CMTimeMakeWithSeconds(timeSlider.value * durationSeconds, player.currentTime.timescale);
    [self.player seekToTime:newTime];
}

使用UISlider(此处称为timeSlider)和上述方法。

以下是在播放时更新滑块的方法:

self.playbackObserver = [player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock:^(CMTime time) {
    CMTime endTime = CMTimeConvertScale (player.currentItem.asset.duration, player.currentTime.timescale, kCMTimeRoundingMethod_RoundHalfAwayFromZero);
    if (CMTimeCompare(endTime, kCMTimeZero) != 0) {
        double normalizedTime = (double) player.currentTime.value / (double) endTime.value;
        self.timeSlider.value = normalizedTime;
    }
    Float64 currentSeconds = CMTimeGetSeconds(player.currentTime);
    int mins = currentSeconds/60.0;
    int secs = fmodf(currentSeconds, 60.0);
    NSString *minsString = mins < 10 ? [NSString stringWithFormat:@"0%d", mins] :      [NSString stringWithFormat:@"%d", mins];
    NSString *secsString = secs < 10 ? [NSString stringWithFormat:@"0%d", secs] : [NSString stringWithFormat:@"%d", secs];
    currentTimeLabel.text = [NSString stringWithFormat:@"%@:%@", minsString, secsString];
}];

pat是timeslider的uislider对象...所以每当新歌开始播放时,滑块自动从开头开始? - coded
播放列表中的歌曲在表格视图中..我有一些问题..如果可以的话,我能给您发电子邮件吗? - coded
什么是durationSeconds?我可以赋什么值给它? - Ashutosh Salodkar
这是一个浮点数。例如可以是0.2。 - Or Arbel

5
我已经制作了自己的播放器来播放视频。这里是我制作的 UISlider 的代码。 初始化 UISlider。
self.progressBar = [[[UISlider alloc] init] autorelease];
self.progressBar.frame = CGRectMake(44*frameWidth/240, 6*frameHeight/160, 187*frameWidth/240,33*frameHeight/160);
[self.progressBar addTarget:self action:@selector(progressBarChanged:) forControlEvents:UIControlEventValueChanged];
[self.progressBar addTarget:self action:@selector(proressBarChangeEnded:) forControlEvents:UIControlEventTouchUpInside];
[self.progressBar setThumbImage:[UIImage imageNamed:@"Slider_button"] forState:UIControlStateNormal];
[self.playerManageViewBottom addSubview:self.progressBar];

现在添加一个观察者和相应的功能。
CMTime interval = CMTimeMake(33, 1000);
playbackObserver = [self.moviePlayer addPeriodicTimeObserverForInterval:interval queue:dispatch_get_current_queue() usingBlock: ^(CMTime time) {
    CMTime endTime = CMTimeConvertScale (self.moviePlayer.currentItem.asset.duration, self.moviePlayer.currentTime.timescale, kCMTimeRoundingMethod_RoundHalfAwayFromZero);
    if (CMTimeCompare(endTime, kCMTimeZero) != 0) {
        double normalizedTime = (double) self.moviePlayer.currentTime.value / (double) endTime.value;
        self.progressBar.value = normalizedTime;
    }
    self.playBackTime.text = [self getStringFromCMTime:self.moviePlayer.currentTime];
}];

Functions :


-(void)progressBarChanged:(UISlider*)sender
{
    if (self.isPlaying) {
        [self.moviePlayer pause];
    }
    CMTime seekTime = CMTimeMakeWithSeconds(sender.value * (double)self.moviePlayer.currentItem.asset.duration.value/(double)self.moviePlayer.currentItem.asset.duration.timescale, self.moviePlayer.currentTime.timescale);
    [self.moviePlayer seekToTime:seekTime];
}

-(void)进度条改变结束:(UISlider*)sender { if (self.isPlaying) { [self.moviePlayer play]; } }

希望这能对你有所帮助。


感谢回答。如何在音频完成后停止观察者?目前即使音频结束,它仍会更改标签(self.playBackTime.text)。 - Hitarth
@Hitarth 那是很久以前了,所以我记不清楚了。你可以在这里查看完整的播放器实现 https://github.com/hemkaran/HRVideoPlayer 看看这是否有帮助。 - hemkaran_raghav

3

我尝试了最高赞的解决方案,对于较长的视频来说还可以,但当我有一个约4秒钟的视频时,UISlider非常卡顿。如果你想要更精确,可以尝试这个解决方案:

- (IBAction)sliderSlid:(id)sender {
    if ([sender isKindOfClass:[UISlider class]]) {
        UISlider *slider = sender;

        CMTime playerDuration = player.currentItem.duration;
        if (CMTIME_IS_INVALID(playerDuration)) {
            return;
        }

        double duration = CMTimeGetSeconds(playerDuration);
        if (isfinite(duration)) {
            float minValue = [slider minimumValue];
            float maxValue = [slider maximumValue];
            float value = [slider value];

            double time = duration * (value - minValue) / (maxValue - minValue);

            [player seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
        }
        [player pause];
    }
}

1

这是我的代码,可以在线播放音频歌曲并带有音量滑块。您可以轻松地增加或减少音量。使用AvAudioPlayer...

*

AudioPlayerController.h 
@interface AudioPlayerController : UIViewController{

    AVAudioPlayer *audioPlayer;
    NSMutableData *data;
    NSURLConnection *connection;
    UIView *myView;
    IBOutlet UISlider *volumeSlider1;
    IBOutlet UIView *volumeSlider;



}
@property (retain, nonatomic) IBOutlet UIActivityIndicatorView *activity;
@property (retain ,nonatomic)  AVAudioPlayer *audioPlayer;
- (IBAction)pause:(id)sender;
- (IBAction)play:(id)sender;
- (IBAction)stop:(id)sender;
@end

AudioPlayerController.m
- (void)viewDidLoad
{
//JD...
    [super viewDidLoad];

    volumeSlider1.minimumValue = 0;
    volumeSlider1.maximumValue = 10;
    volumeSlider1.value = [[[NSUserDefaults standardUserDefaults] valueForKey:@"volume"] intValue]; 

    self.navigationController.navigationBarHidden = NO;
    [self getAudioFromNet];
  }
- (void)getAudioFromNet {

    NSURL *url = [NSURL URLWithString:@"http://sound17.mp3pk.com/indian/cocktail/[Songs.PK]%20Cocktail%20-%2001%20-%20Tum%20Hi%20Ho%20Bandhu.mp3"]; 

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

}
- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData {
    if (data==nil) {
        data = [[NSMutableData alloc] initWithCapacity:2048];
    }
    [data appendData:incrementalData];
}
- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {

    audioPlayer = [[AVAudioPlayer alloc] initWithData:data error: nil];
    [audioPlayer setVolume:3];
    [audioPlayer play];

}
- (IBAction)play:(id)sender{


    [audioPlayer play];

}
- (IBAction)pause:(id)sender{


    [audioPlayer pause];

}
- (IBAction)stop:(id)sender{



    [audioPlayer stop];

}
//This Method is Used for Volume...
- (IBAction)sliderMoved:(UISlider *)aSlider
{
    audioPlayer.volume = volumeSlider1.value;

    int valumeInt = volumeSlider1.value;
    [[NSUserDefaults standardUserDefaults] setValue:[NSString stringWithFormat:@"%d",valumeInt] forKey:@"volume"];
    audioPlayer.volume = [[[NSUserDefaults standardUserDefaults] valueForKey:@"volume"] intValue]; 

}
@end

*


伙计,我猜他是在问刷子,而不是音量条。 - Prasad De Zoysa
我不想要音量条,我要的是进度条,而且我正在使用AVPlayer而不是AVAudioPlayer。 - coded

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接