Добавьте пользовательские элементы управления в AVPlayer в Swift

Я пытаюсь создать представление таблицы, чтобы я мог воспроизводить видео. Я могу сделать это с помощью AVPlayer и layer.

Я хочу добавить пользовательскую кнопку воспроизведения и паузы с ползунком в нижней части просмотра видео.

AVPlayerController поставляется со встроенными элементами управления.

Как я могу реализовать это в AVPlayer. Я искал примеры. Но я не нашел ни одного.

Есть ли какие-нибудь примеры GitHub или примеры кода, которым я могу следовать? Любая помощь будет действительно оценена.


person A.S    schedule 28.03.2017    source источник
comment
Вы видели образец кода Apple? developer.apple.com/library/content/samplecode/AVPlayerDemo/   -  person Lepidopteron    schedule 28.03.2017
comment
вам нужно скрыть пользовательский элемент управления и создать собственный   -  person Anbu.Karthik    schedule 28.03.2017
comment
Я ищу быстрые примеры   -  person A.S    schedule 28.03.2017


Ответы (2)


здесь я добавляю точки, которые вам нужно настроить в зависимости от ваших потребностей.

Шаг 1

изначально скрыть элементы управления AVPlayer,

 YourAVPlayerViewController.showsPlaybackControls = false

Шаг 2

создать структуру, как

введите описание изображения здесь

одна метка для текущей продолжительности, одна метка для общей продолжительности, одна кнопка пользовательского интерфейса для паузы и воспроизведения текущего плеера и одна UISlider для поиска видео.

шаг 3

изначально закрыть простые шаги.

сначала остановите и воспроизведите проигрыватель, используя действие кнопки, 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)

в-третьих, установить текущее время игрока на текущую метку продолжительности

    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 запустится, затем остановите плеер

ручкаPlayheadSliderTouchBegin

@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)
}
person Anbu.Karthik    schedule 28.03.2017
comment
очень подробный ответ :) - person Siu Chung Chan; 09.05.2017
comment
Как перейти в полноэкранный режим? - person Bhavin Ramani; 18.08.2017
comment
@BhavinRamani - на основе вопроса я добавил ответ, если вам нужно перейти в полноэкранный режим, нужно добавить еще одну кнопку, а внутри действия использовать преобразование поворота - person Anbu.Karthik; 18.08.2017
comment
@ Anbu.karthik, как добавить этот настраиваемый вид поверх avplayer? - person Syed Ali Salman; 16.01.2018
comment
@SyedAliSalman - сначала создайте один UIView (ваш вид addsubvew.avplayer), затем добавьте пользовательский вид (ваш вид.addview.customview) - person Anbu.Karthik; 16.01.2018
comment
то есть не добавляем поверх AVPlayerController.view? Правильно? - person Syed Ali Salman; 16.01.2018
comment
Спасибо. Я добавлял AVPlayerController.view, и он не отображался правильно. - person Syed Ali Salman; 16.01.2018
comment
@ Anbu.Karthik, спасибо за отличный ответ !!. Можем ли мы добавить масштабирование при двойном касании или двух пальцах на плеере, если для showPlaybackControls = false установлено значение false? - person Mayank Palotra; 11.09.2020
comment
UISlider не обновляется при воспроизведении видео, это ошибка, поэтому не полный ответ. Пожалуйста, обновите ответ соответственно - person iPhone 7; 08.04.2021

В дополнение к ответу Anbu.Karthik, управление слайдером можно лучше обрабатывать с помощью одной функции, как показано ниже:

slider.addTarget(self, action: #selector(self.handlePlayheadSliderValueChanged(sender:event:)), for: .valueChanged)

Изменение значения ползунка:

Обратите внимание на случаи переключения, обрабатывающие все фазы события ползунка

@objc func handlePlayheadSliderValueChanged(sender: UISlider, event: UIEvent) {
    if let duration: CMTime = player?.currentItem?.asset.duration {
        let newCurrentTime: Float64 = CMTimeGetSeconds(duration) * Double(sender.value)
        videoLengthLabel.text = self.stringFromTimeInterval(interval: newCurrentTime)
        if let touchEvent = event.allTouches?.first {
            switch (touchEvent.phase) {
            case .began:
                // on slider touch begin
                pauseVideo()
                break
            case .moved:
                // on slider movement
                let seekToTime: CMTime = CMTimeMakeWithSeconds(newCurrentTime, preferredTimescale: 600)
                player?.seek(to: seekToTime, completionHandler: { (completedSeek) in
                    // any additional operation upon seek completion
                })
                break
            case .ended:
                // on slider touch end (finger lift)
                playVideo()
                break
            default:
                break
            }
        }
    }
}
person Nagendra Rao    schedule 06.12.2020