【问题标题】:AVPlayer - Fast Backward / Forward StreamAVPlayer - 快速向后/向前流
【发布时间】:2013-02-12 05:57:23
【问题描述】:

这是我在 viewDidLoad 中的代码:

AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://groove.wavestreamer.com:7321/listen.pls?sid=1"]];

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];

music = [[AVPlayer playerWithPlayerItem:playerItem] retain];
[music play];

我的问题:
如何创建一个按钮,当它被按下时快进/快退 5 秒?

感谢您的回答... :)

编辑:如何添加到当前时间...

CMTime currentTime = music.currentTime;

...5 秒?

【问题讨论】:

  • 这是正确的方法吗? CMTime currentTime = music.currentTime; float audioCurrentSeconds = CMTimeGetSeconds(currentTime);音频电流秒 += 5.0; [音乐 seekToTime:audioCurrentSeconds toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

标签: iphone ios xcode avplayer forward


【解决方案1】:

使用AVPlayer方法seekToTime

AVPlayer *player=..;
 [player seekToTime:time toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

这是reference

希望对你有帮助

【讨论】:

  • 转发工作正常,但我不能用这种方法倒带。你知道为什么吗?
  • 当您尝试倒带时会发生什么?
  • 您可能给出了错误的时间,从您在评论中显示的内容来看,您给了它一个 int/float?它应该是一个 CMTime 结构
  • @Daniel 你如何捕捉/检测快进动作?
  • @NorthBlast 您需要制作自己的控件,某种擦洗栏,当它向上/向后滑动时,您会采取相应的行动
【解决方案2】:

您可以使用 avPlayer.rate 快退/快进

费率:1.0 正常 0.0 暂停

但首先,您应该检查 avPlayerItem 是否可以执行您的操作

欲了解更多信息:https://developer.apple.com/LIBRARY/ios/documentation/AVFoundation/Reference/AVPlayer_Class/index.html#//apple_ref/occ/instp/AVPlayer/rate

【讨论】:

  • 您好,请问您能帮我在 avplayer 中提高播放速度吗?
【解决方案3】:

在 Swift 中

fileprivate let seekDuration: Float64 = 5


@IBAction func doForwardJump(_ sender: Any) {
    guard let duration  = player.currentItem?.duration else{
        return
    }
    let playerCurrentTime = CMTimeGetSeconds(player.currentTime())
    let newTime = playerCurrentTime + seekDuration

    if newTime < CMTimeGetSeconds(duration) {

        let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
        player.seek(to: time2)
    }
}
@IBAction func doBackwardJump(_ sender: Any) {

    let playerCurrentTime = CMTimeGetSeconds(player.currentTime())
    var newTime = playerCurrentTime - seekDuration

    if newTime < 0 {
        newTime = 0
    }
    let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
    player.seek(to: time2)

}

在 Objective-C 中,

#define seekDuration (float)5

- (IBAction)backwardButtonAction:(UIButton *)sender {
    float playerCurrentTime = [self getCurrentTime];
    float newTime = playerCurrentTime - seekDuration;

    if (newTime < 0) {
        newTime = 0;
    }
    CMTime time = CMTimeMake(newTime*1000, 1000);
    [self.player seekToTime:time completionHandler:^(BOOL finished) {
        dispatch_async(dispatch_get_main_queue(), ^{
            playerSliderisScrubbing = NO;
        });
    }];
}
- (IBAction)forwardButtonAction:(UIButton *)sender {
    float duration = [self getPlayerDuration];
    float playerCurrentTime = [self getCurrentTime];
    float newTime = playerCurrentTime + seekDuration;

    if (newTime < duration) {
        CMTime time = CMTimeMake(newTime*1000, 1000);
        [self.player seekToTime:time completionHandler:^(BOOL finished) {
            dispatch_async(dispatch_get_main_queue(), ^{
                playerSliderisScrubbing = NO;
            });
        }];

    }
}
- (float)getCurrentTime {
    float seconds = 0;
    if (_player) {
        seconds = CMTimeGetSeconds([_player currentTime]);
    }
    return seconds;
}
- (float)getPlayerDuration {
    float seconds = 0;
    if (_player) {
        seconds = CMTimeGetSeconds([[_player currentItem] duration]);
    }
    return seconds;
}

【讨论】:

    【解决方案4】:

    Swift 4、4.2 和 5

    var player : AVPlayer!
    
    @IBAction func fastForwardBtn(_ sender: UIButton) {
            let moveForword : Float64 = 5
    
            if player == nil { return }
            if let duration  = player!.currentItem?.duration {
            let playerCurrentTime = CMTimeGetSeconds(player!.currentTime())
            let newTime = playerCurrentTime + moveForword
            if newTime < CMTimeGetSeconds(duration)
            {
                let selectedTime: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000)
                player!.seek(to: selectedTime)
            }
            player?.pause()
            player?.play()
            }
    
        }
    
    @IBAction func rewindBtn(_ sender: UIButton) {
                let moveBackword: Float64 = 5
                if player == nil
                {
                    return
                }
                let playerCurrenTime = CMTimeGetSeconds(player!.currentTime())
                var newTime = playerCurrenTime - moveBackword
                if newTime < 0
                {
                    newTime = 0
                }
                player?.pause()
                let selectedTime: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000)
                player?.seek(to: selectedTime)
                player?.play()
            }
    

    【讨论】:

      【解决方案5】:

      Swift 5 向前或向后搜索的函数

      private let seekDuration: Float64 = 15
          
      private func seekPlayback(isForward: Bool) {
          guard
              let player = player,
              let duration = player.currentItem?.duration
          else {
              return
          }
      
          let currentElapsedTime = player.currentTime().seconds
      
          var destinationTime = isForward ? (currentElapsedTime + seekDuration) : (currentElapsedTime - seekDuration)
      
          if destinationTime < 0 {
              destinationTime = 0
          }
      
          if destinationTime < duration.seconds {
              let newTime = CMTime(value: Int64(destinationTime * 1000 as Float64), timescale: 1000)
              player.seek(to: newTime)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 1970-01-01
        • 2020-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多