web-dev-qa-db-ja.com

swiftでAVPlayerにカスタムコントロールを追加します

私はビデオを再生できるようにテーブルビューを作成しようとしています。 AVPlayerとレイヤーを使用してこれを行うことができます。

ビデオビューの下部にスライダー付きのカスタム再生ボタンと一時停止ボタンを追加したい。

AVPlayerControllerにはこれらのコントロールが組み込まれています。

これらをAVPlayerに実装するにはどうすればよいですか。私は例を探してきました。しかし、私は何も見つけていません。

従うことができるGitHubの例やコードサンプルはありますか?どんな助けも本当に感謝されます。

11
A.S

ここにポイントを追加します。必要に応じてカスタマイズする必要があります。

ステップ-1

最初にAVPlayerコントロールを非表示にし、

_ YourAVPlayerViewController.showsPlaybackControls = false
_

ステップ-2

のような構造を作成する

enter image description here

現在の期間の1つのラベル、全体の期間の1つのラベル、現在のプレーヤーの一時停止と再生用の1つのUIbutton、ビデオのシーク用の1つのUISlider。

ステップ-3

最初に簡単な手順を閉じます。

最初にbutton actionを使用してプレーヤーを停止して再生します。currentPlayerはAVPlayer名です。

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

次のように、ビデオの長さを設定します

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

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

3番目に、プレーヤーの現在時刻を現在の期間ラベルに設定します

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

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

次のメソッドは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)
}
_

最後に、シーク時間を計算するためのスライダー制御に行きます

__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) {

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

最後にシークに基づいてプレーヤーを移動します

_ @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)
}
_
36
Anbu.Karthik