快速向 AVPlayer 添加自定义控件 [英] Add custom controls to AVPlayer in swift

查看:21
本文介绍了快速向 AVPlayer 添加自定义控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个表格视图,以便我能够播放视频.我可以使用 AVPlayer 和层来做到这一点.

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

AVPlayerController 内置了这些控件.

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

是否有任何我可以遵循的 GitHub 示例或代码示例?任何帮助将不胜感激.

解决方案

这里我补充一下,你需要根据自己的需要定制.

第一步

最初隐藏您的 AVPlayer 控件,

 YourAVPlayerViewController.showsPlaybackControls = false

第 2 步

创建类似的结构

<块引用>

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

第 3 步

首先关闭简单的步骤.

<块引用>

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

@IBAction func handlePlayPauseButtonPressed(_ sender: UIButton) {//sender.isSelected ?currentPlayer.pause() : currentPlayer.play()如果sender.isSelected {currentPlayer.pause()}别的 {currentPlayer.play()}}

<块引用>

秒设置视频时长,如

 let duration : CMTime = currentPlayer.currentItem!.asset.duration让秒:Float64 = CMTimeGetSeconds(duration)lblOverallDuration.text = self.stringFromTimeInterval(间隔:秒)

<块引用>

第三个设置播放器当前时间为当前时长标签

 让持续时间:CMTime = currentPlayer.currentTime()让秒:Float64 = CMTimeGetSeconds(duration)lblcurrentText.text = self.stringFromTimeInterval(间隔:秒)

<块引用>

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

func stringFromTimeInterval(interval: TimeInterval) ->细绳 {让间隔 = Int(interval)让秒 = 间隔 % 60让分钟 = (间隔/60) % 60让小时=(间隔/3600)返回字符串(格式:%02d:%02d:%02d",小时、分钟、秒)}

<块引用>

最后我们使用滑块控件来计算寻道时间

_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)

<块引用>

让我们开始行动,最初在 touchbegin 启动时停止播放器

handlePlayheadSliderTouchBegin

@IBAction func handlePlayheadSliderTouchBegin(_ sender: UISlider) {currentPlayer.pause()}

<块引用>

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

@IBAction func handlePlayheadSliderValueChanged(_ sender: UISlider) {让持续时间:CMTime = currentPlayer.currentItem!.asset.duration让秒:Float64 = CMTimeGetSeconds(duration) * sender.value//var newCurrentTime: TimeInterval = sender.value * CMTimeGetSeconds(currentPlayer.currentItem.duration)lblcurrentText.text = self.stringFromTimeInterval(间隔:秒)}

<块引用>

最后根据seek移动玩家

 @IBAction func handlePlayheadSliderTouchEnd(_ sender: UISlider) {让持续时间:CMTime = currentPlayer.currentItem!.asset.durationvar newCurrentTime: TimeInterval = sender.value * CMTimeGetSeconds(duration)var seekToTime: CMTime = CMTimeMakeWithSeconds(newCurrentTime, 600)currentPlayer.seek(toTime:seekToTime)}

I am trying to create a table view such that I am able to play videos . I am able to do this using AVPlayer and layer.

I want to add a custom play and pause button with a slider to the bottom of a video view.

AVPlayerController comes built in with these controls.

How can I implement these in AVPlayer. I have been looking for examples. But I haven't found any.

Are there any GitHub examples or code samples that I can follow? Any help will be really appreciated.

解决方案

here I add the points , you need to customize based on your need.

Step-1

initially hide your AVPlayer controls,

 YourAVPlayerViewController.showsPlaybackControls = false

Step-2

create the structure like

one label for current Duration, One label for overall Duration, one UIbutton for pause and play your current player and one UISlider for seek The video.

step-3

initially close the simple steps.

first stop and play the player using button action , currentPlayer is your AVPlayer name.

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

second set the video duration, as like

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

    lblOverallDuration.text = self.stringFromTimeInterval(interval: seconds)

third set the player current time to current duration label

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

    lblcurrentText.text = self.stringFromTimeInterval(interval: seconds)

the following method is convert from NSTimeinterval to 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)
}

finally we go for slider control for calulate the seek time

_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)

lets we go for action, initially when touchbegin is start then stop the player

handlePlayheadSliderTouchBegin

@IBAction func handlePlayheadSliderTouchBegin(_ sender: UISlider) {
currentPlayer.pause()
}

set the current item label for calculate the 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)
   }

finally move the player based on seek

 @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)
}

这篇关于快速向 AVPlayer 添加自定义控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆