【问题标题】:Uislider with AvplayerUislider 与 Avplayer
【发布时间】:2015-11-05 10:09:22
【问题描述】:

您好,我创建了 Avplayer 用于从服务器播放音频,它工作正常,但 UISlider 即使在更新 UISlider 方法后也不与音频同步,但滑块移动正常但不与音频同步。我需要将该音频与 UISlider 匹配

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;
    [self.view addSubview:seekbar];
-(void)Audio{
    NSString *urlString= @"https:/embed-ssl.wistia.com/deliveries/85dcf8de9db3830f47f136a4dba89114be58403f/dhwpxq4l9l.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];
    NSLog(@"Audio playing");
}

- (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:(UISlider*)sender {
   CGFloat currentSongTime = CMTimeGetSeconds([audioPlayer currentTime]);
    seekbar.value = currentSongTime;

    seekbar.minimumValue=0;
    seekbar.maximumValue=currentSongTime;
}

- (void)updateProgress {

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

【问题讨论】:

    标签: ios


    【解决方案1】:

    为什么每次更改都更改最大值? 根据audioPlayer.currentItem.duration获取AVPlayerStatusReadyToPlay时可以设置minimumValuemaximumValue

    所以你可以使用 seektime 而不是:

        else if (audioPlayer.status == AVPlayerStatusReadyToPlay) {
                    NSLog(@"AVPlayerStatusReadyToPlay");
                    [audioPlayer play];
                    seekbar.minimumValue = 0;
                    seekbar.maximumValue = CMTimeGetSeconds(audioPlayer.currentItem.duration);
    
        }
    

    【讨论】:

    • 你不能像这样设置最大值。我只对那个感到震惊。
    • 你不能是什么意思?你可以为 UISlider 设置一个最大值,当播放器准备好播放时,你就有了音频的持续时间。
    • 是的,当我开始玩@Adam 时,我的滑块移动到结束
    • 那是因为您将搜索栏值设置为等于最大值。只需设置我写的时间并删除整个seektime 函数。
    • 我这样做了,但仍然无法解决这一行的问题 seekbar.maximumValue = audioPlayer.currentItem.duration;
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多