Как воспроизводить локальное видео в AVPlayer, используя массив URL-адресов?

Я разрабатываю приложение для iOS и хочу иметь возможность воспроизводить локальный видеофайл, когда вы выбираете строку в табличном представлении. После выбора строки ячейки она переходит к AVPlayerViewController, где должно воспроизводиться видео, однако после того, как переход выполнен и AVPlayerViewController представлен, AVPlayer, который он содержит, остается пустым. Все элементы управления отображаются, но проигрыватель отображается пустым. Есть ли причина, по которой игрок не играет? Я добавил все свои видео в папку и добавил эту папку с видео в свой основной пакет, поэтому я не уверен, почему плеер не воспроизводит видео. Буду очень признателен за любые предложения относительно того, как я могу заставить игрока играть и работать. Я также запустил переход к AVPlayerViewController в раскадровке, и он переходит каждый раз, когда нажимается ячейка.

Код, в который загружаются видео:

 import UIKit
 import AVKit
 import AVFoundation

  class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


var playerViewController = AVPlayerViewController()
var player = AVPlayer()
var videoURL = [URL]()
var videoUrl = [URL]()
var drillVid = URL(fileURLWithPath: String())

override func viewDidLoad() {
    super.viewDidLoad()
videoUrl = [URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallBBw:Pound.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallBtwLegwPound.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallCrosswPound.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallHiLo.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallThruHoop.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallIOw:Wiper.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallJuggle.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallInOut.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallWiper.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwpBallOverDribble.mp4")]


    tableView.delegate = self
    tableView.dataSource = self }

Код, в котором отображается игрок:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{

drillVid = videoUrl[indexPath.row]

    return cell
}

Код, в котором отображается AVPlayerViewController, и проигрыватель должен воспроизводить видео, но ничего не воспроизводит, он просто пустой:

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  drillVid = videoUrl[indexPath.row]. }


  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {


        if segue.identifier == "playDrill" {
                let destination = segue.destination as! AVPlayerViewController
            if let indexPath = self.tableView.indexPathForSelectedRow {
                    drillVid = videoURL[indexPath.row]
                    let destination = segue.destination as! AVPlayerViewController
                    destination.player = AVPlayer(url: drillVid)
                    destination.player?.play()

                }
                }

person Marko Cain    schedule 18.09.2017    source источник


Ответы (1)


[URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/TwoBallBBw:Pound.mp4")

это не то, как вы получаете файл в своем пакете ..

It's let path = Bundle.main.path(forResource: "Pound", ofType: "mp4")

Пример: добавьте в свой проект «видео» в формате .mp4. Выберите видео и на правой панели сделайте цель своим приложением. Это добавит видео в ваш основной пакет.

На раскадровке добавьте кнопку. Добавьте AVPlayerController. Control + щелкните эту кнопку и перетащите ее в AVPlayerController.

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

В коде контроллера представления переопределите функцию prepareForSegue. Получите место назначения и установите player для воспроизведения видео, выбрав Путь к видео.

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

Код выглядит так:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destination = segue.destination as! AVPlayerViewController

        let url = URL(fileURLWithPath: Bundle.main.path(forResource: "Video", ofType: "mp4")!)
        destination.player = AVPlayer(playerItem: AVPlayerItem(url: url))
        destination.player?.play()
    }

}

Когда вы запускаете код и нажимаете кнопку, он воспроизводит видео. Проверял сам на iPhone 6S, iOS 11.

person Brandon    schedule 18.09.2017
comment
Спасибо за совет, но это не помогает решить мой вопрос. Разве по этой причине игрок не играет? - person Marko Cain; 18.09.2017
comment
@MarkoCain; Скорее всего, вы указываете проигрывателю неправильный путь. Это дает правильный путь для ресурса Pound, и видеопроигрыватель сможет его воспроизвести. - person Brandon; 18.09.2017
comment
Хорошо, спасибо, никогда не говорил, что это не помогло! Я попробую. - person Marko Cain; 18.09.2017
comment
Я добавил файлы, как вы предложили, но проигрыватель по-прежнему остается пустым и ничего не воспроизводится. Я не получаю ошибок, просто игрок отказывается играть. - person Marko Cain; 18.09.2017
comment
@MarkoCain; Вы что-то делаете неправильно. Я только что сделал образец проекта, чтобы проверить это. Работает нормально .. - person Brandon; 18.09.2017
comment
Это все еще не работает, есть ли способ поговорить или я пришлю вам свой код, потому что я буквально пробовал то, что вы делали шаг за шагом, а мой плеер все еще не играет. - person Marko Cain; 18.09.2017
comment
Я разобрался в проблеме! У меня был закрытый кронштейн в неправильном месте. Простая ошибка, но ваш совет, тем не менее, помог, так как я заставил плеер работать, так что спасибо !!! - person Marko Cain; 19.09.2017
comment
У меня нет кнопки закрытия в плеере - person Deepakraj Murugesan; 29.11.2017