UISlider 的 Avplayer 问题

Posted

技术标签:

【中文标题】UISlider 的 Avplayer 问题【英文标题】:Avplayer issues with UISlider 【发布时间】:2015-11-02 10:54:55 【问题描述】:

您好,我刚刚创建了 AVplayer 用于从服务器播放音频。我的问题是我的 UISlider 没有基于 Audioplayer 移动。请帮我解决这个问题。

    seekbar =[[UISlider alloc]init];
    seekbar.frame=CGRectMake(10,CGRectGetMinY(PlayAudio.frame)-50, CGRectGetWidth(self.view.frame)-20, 20);
    [seekbar addTarget:self action:@selector(seekTime:) forControlEvents:UIControlEventValueChanged];
    seekbar.continuous=YES;
    seekbar.minimumValue=0;
    seekbar.maximumValue=20;
    [self.view addSubview:seekbar];

    -(void)Audio
        NSString *urlString= @"https.wav";

        audioPlayer = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerItemDidReachEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[audioPlayer currentItem]];
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];
        [audioPlayer play];


    

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

        if (object == audioPlayer && [keyPath isEqualToString:@"status"]) 
            if (audioPlayer.status == AVPlayerStatusFailed) 
                NSLog(@"AVPlayer Failed");

             else if (audioPlayer.status == AVPlayerStatusReadyToPlay) 
                NSLog(@"AVPlayerStatusReadyToPlay");
                [audioPlayer play];


             else if (audioPlayer.status == AVPlayerItemStatusUnknown) 
                NSLog(@"AVPlayer Unknown");

            
        
    

    - (void)seekTime:(id)sender 

        [seekbar setValue:CMTimeGetSeconds(audioPlayer.currentTime)];
    

【问题讨论】:

是否调用了 seekTime 方法? (似乎不在此代码中)。应该从 NSTimer 调用吗? Seektime 是我的 UISlider 方法名称。请检查一下 我已经编辑了,请查看@TiagoLira 【参考方案1】:

seekTime 仅在用户移动滑块时调用。所以这不是更新它的好地方。

您应该有一个从 NSTimer 调用的 updateProgress 方法,这是您需要更新滑块位置的地方:

- (void)updateProgress 
        [seekbar setValue:CMTimeGetSeconds(audioPlayer.currentTime)];

所以每次 NSTimer 触发时,它都应该更新滑块的位置。

seekTime 方法中,您应该做相反的事情:将音频播放设置为用户选择的点。像这样的:

[audioPlayer setCurrentTime:seekbar.value];

【讨论】:

它的工作非常酷,但它不与 Audioplayer 同步。我在 UISlider 方法中做了什么? 在 seekTime 部分,您应该将播放设置为 UISlider 上的值。我已经编辑了答案以表明这一点。 [audioPlayer setCurrentTime:seekbar.value]; 此代码在 UISlider 操作中不起作用@Tiago Lira

以上是关于UISlider 的 Avplayer 问题的主要内容,如果未能解决你的问题,请参考以下文章

UISlider 不能与 AVPlayer 一起正常工作

为 AVPlayer 更新时 UISlider 跳转

AVPlayer seekToTime 不正确使用 UISlider

Objective-c,AVPlayer 中的 UISlider 无法正常工作,在洗涤器之后

UISlider Swift 的 AVPlayer 进度

ViewController 加载时 UISlider 的 AVPlayer currentTime 更新