0

I am developing an app for iOS and I have constructed code to where once a cell in a table view is selected, it segues to an AVPlayerViewController and plays a local video clip depending on which cell row was selected. However when it segues to the AVPlayerViewController, the player appears but no video is played, why is this? I have even added a print statement to the didSelectAtRow function to make sure the correct video file is chosen. It should be noted the code works just fine until it comes time to actually play a video file (the player appears but just remains empty).

import UIKit
import AVKit
import AVFoundation

class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var initialRow = Int()
var arrayForKey2 = [[String]]()
var keyIndex = Int()
var headLabel = String()
var labels = Array(trainingDict.keys)
var playerViewController = AVPlayerViewController()
var player = AVPlayer()
var videoURL = [URL]()
var videoUrl = [URL]()
var drillVid = URL(fileURLWithPath: String())

var firstTips = ["Tip 1: Stay Hydrated", "Tip 1: Keep elbow tucked", "x", "Tip 1: Take quick breaks:", "Tip 1: Keep your head up", "Tip 1: Don't cross your feet", "Tip 1: Don't do more than 15 reps"]


@IBOutlet weak var tableView: DrillsTableView!

@IBOutlet weak var drillLabel: UILabel!

@IBOutlet weak var labelBackground: UIView!

@IBAction func back(_ sender: Any) {

    dismiss(animated: true, completion: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()

    videoURL = [URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/LowDribble.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallBBw:Pound.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallBBw:PickUp.mp4"), URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallBB.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallInOut.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallOverDribble.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallThruHoop.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallThruLeg.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallThruLegLo.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallWiper.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallIOBBCrossCombo.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallIOBetweenLegsCombo.mp4"),URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BHB DrillVids/OneBallComboFreestyle.mp4")]

    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
    drillLabel.text = labels[keyIndex]

    playerViewController.player = player



    for (key, value) in trainingDict {
        print("\(key) --> \(value)")
        objectArray.append(Objects(sectionName: key, sectionObjects: value))
    }
}




func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DrillsTableViewCell




    if initialRow == 1 {
    drillVid = videoURL[indexPath.row]

    }

    if initialRow == 2 {
        drillVid = videoUrl[indexPath.row]
    }

    print(initialRow)
    print(indexPath.row)
    print(drillVid)

}

//changes KeysController tip labels accordingly 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Tips" {
        if let keysVC = segue.destination as? KeysController {


            keysVC.keyTip1 = firstTips[initialRow]
        }
        if segue.identifier == "playDrill", initialRow == 1 {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                    drillVid = videoURL[indexPath.row]
                    let destination = segue.destination as! AVPlayerViewController
                    destination.player = playerViewController.player
                    playerViewController.player = player
                    player = AVPlayer(url: drillVid)
                    player.play()



                }

                if initialRow == 3 {
                    if let indexPath = self.tableView.indexPathForSelectedRow {
                    let video = videoUrl[indexPath.row]
                    let destination = segue.destination as! AVPlayerViewController
                    destination.player = AVPlayer(url: video)
                    destination.player?.play()
                }
            }
        }


    }
}
Marko Cain
  • 15
  • 1
  • 5
  • 2
    I think your video path is wrong. Now your video file path is where the video located on your desktop. You have to add the video files to your project and then you have to access those video files. – Vini App Sep 17 '17 at 00:37
  • I did add the files to my project – Marko Cain Sep 17 '17 at 19:05

1 Answers1

0

If you already added those files to the project, then you have to access those files like below :

videoURL = [URL(fileURLWithPath: Bundle.main.path(forResource: "LowDribble", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallBBw:Pound", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallBBw:PickUp", ofType: "mp4")!), URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallBB", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallInOut", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallOverDribble", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallThruHoop", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallThruLeg", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallThruLegLo", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallWiper", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallIOBBCrossCombo", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallIOBetweenLegsCombo", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallComboFreestyle", ofType: "mp4")!)]

videoUrl = [URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallBBw:Pound", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallBtwLegwPound", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallCrosswPound", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallHiLo", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "OneBallThruHoop", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallIOw:Wiper", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallJuggle", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallInOut", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwoBallWiper", ofType: "mp4")!),URL(fileURLWithPath: Bundle.main.path(forResource: "TwpBallOverDribble", ofType: "mp4")!)]
Vini App
  • 7,339
  • 2
  • 26
  • 43
  • Thank for you for your assistance! – Marko Cain Sep 18 '17 at 17:12
  • Im getting an error now that says I'm unwrapping an optional that is nil. Any suggestions? – Marko Cain Sep 18 '17 at 17:17
  • Not working,im getting fatal error that says I'm finding nil when unwrapping an optional – Marko Cain Sep 18 '17 at 17:20
  • Use this: 'guard let path = Bundle.main.path(forResource: "YourvideoFileName", ofType:"mp4") else { debugPrint("YourvideoFileName.mp4 not found") return }' this [link](https://stackoverflow.com/questions/25348877/how-to-play-a-local-video-with-swift) may help – Imrul Kayes Oct 01 '17 at 09:59