【问题标题】:Avplayer issues with UISliderUISlider 的 Avplayer 问题
【发布时间】: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

标签: ios objective-c avplayer uislider


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
相关资源
最近更新 更多