在swift中为AVPlayer添加自定义控件

A.S*_*A.S 11 ios avplayer swift avplayeritem swift3

我正在尝试创建一个表格视图,以便我可以播放视频.我能够使用AVPlayer和图层完成此操作.

我想在视频视图的底部添加一个带滑块的自定义播放和暂停按钮.

AVPlayerController内置了这些控件.

我如何在AVPlayer中实现这些.我一直在寻找例子.但我还没有发现任何.

我可以遵循任何GitHub示例或代码示例吗?任何帮助将非常感激.

Anb*_*hik 36

在这里我添加积分,您需要根据您的需要进行自定义.

步骤1

最初隐藏你的AVPlayer控件,

 YourAVPlayerViewController.showsPlaybackControls = false
Run Code Online (Sandbox Code Playgroud)

第2步

创建像这样的结构

在此输入图像描述

一个标签用于当前持续时间,一个标签用于总持续时间,一个UI按钮用于暂停和播放当前播放器,一个UISlider用于搜索视频.

第3步

最初关闭简单的步骤.

首先停止并使用按钮操作播放播放器,currentPlayer是您的AVPlayer名称.

@IBAction func handlePlayPauseButtonPressed(_ sender: UIButton) {
   //  sender.isSelected ?  currentPlayer.pause() :   currentPlayer.play()
    if sender.isSelected {
        currentPlayer.pause()
    }
    else {
        currentPlayer.play()
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个设置视频持续时间,就像

    let duration : CMTime = currentPlayer.currentItem!.asset.duration
    let seconds : Float64 = CMTimeGetSeconds(duration)

    lblOverallDuration.text = self.stringFromTimeInterval(interval: seconds)
Run Code Online (Sandbox Code Playgroud)

第三个将玩家当前时间设置为当前持续时间标签

    let duration : CMTime = currentPlayer.currentTime()
    let seconds : Float64 = CMTimeGetSeconds(duration)

    lblcurrentText.text = self.stringFromTimeInterval(interval: seconds)
Run Code Online (Sandbox Code Playgroud)

以下方法从NSTimeinterval转换为HH:MM:SS

func stringFromTimeInterval(interval: TimeInterval) -> String {

    let interval = Int(interval)
    let seconds = interval % 60
    let minutes = (interval / 60) % 60
    let hours = (interval / 3600)
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}
Run Code Online (Sandbox Code Playgroud)

最后我们去滑块控制来计算寻道时间

_playheadSlider.addTarget(self, action: #selector(self.handlePlayheadSliderTouchBegin), for: .touchDown)
_playheadSlider.addTarget(self, action:    #selector(self.handlePlayheadSliderTouchEnd), for: .touchUpInside)
_playheadSlider.addTarget(self, action: #selector(self.handlePlayheadSliderTouchEnd), for: .touchUpOutside)
_playheadSlider.addTarget(self, action: #selector(self.handlePlayheadSliderValueChanged), for: .valueChanged)
Run Code Online (Sandbox Code Playgroud)

让我们采取行动,最初当touchbegin开始然后停止播放器

handlePlayheadSliderTouchBegin

@IBAction func handlePlayheadSliderTouchBegin(_ sender: UISlider) {
currentPlayer.pause()
}
Run Code Online (Sandbox Code Playgroud)

设置当前项标签以计算 sender.value * CMTimeGetSeconds(currentPlayer.currentItem.duration)

@IBAction func handlePlayheadSliderValueChanged(_ sender: UISlider) {

        let duration : CMTime = currentPlayer.currentItem!.asset.duration
     let seconds : Float64 = CMTimeGetSeconds(duration) * sender.value
 //   var newCurrentTime: TimeInterval = sender.value * CMTimeGetSeconds(currentPlayer.currentItem.duration)
lblcurrentText.text = self.stringFromTimeInterval(interval: seconds)
   }
Run Code Online (Sandbox Code Playgroud)

最后根据搜索移动玩家

 @IBAction func handlePlayheadSliderTouchEnd(_ sender: UISlider) {

  let duration : CMTime = currentPlayer.currentItem!.asset.duration
var newCurrentTime: TimeInterval = sender.value * CMTimeGetSeconds(duration)
var seekToTime: CMTime = CMTimeMakeWithSeconds(newCurrentTime, 600)
currentPlayer.seek(toTime: seekToTime)
}
Run Code Online (Sandbox Code Playgroud)

  • 怎么去全屏? (3认同)
  • 很详细的回答:) (2认同)