0

It seems that I can't stream my videos once I downloaded them from Parse backend. However I know that the videos are working well as you can play it from Chrome but not from Safari ( I don't know why ...).

My code to play the video on the AVPlayer is also right since I test it for multiple NSUrl from local database.

Several posts about it confirm that there is a problem going on but no one has an answer.

iOS - Can't stream video from Parse Backend

Cant stream video (PFFile) from parse server

Thanks in advance if someone can help me.

Community
  • 1
  • 1
wbeuil
  • 87
  • 1
  • 10

1 Answers1

0

The secret is to get the PFFIle data, save it locally with the proper extention (mov) and treaming the local file. look at this entry [Cant stream video (PFFile) from parse server][1], the second anwser.

The PFFIle was created with the following code:

let videoPath = info[UIImagePickerControllerMediaURL] as! NSURL


      let imageData = NSData (contentsOfURL:videoPath)! as NSData

            do  {

              let file = try PFFile(name: "_mov", data: imageData, contentType: "video/quicktime")
              videoSaveSelected(file )
            } catch let error as NSError {
              print("Error generating PFFile: \(error)")
            }

This is the code for the player

import UIKit
import AVKit
import MobileCoreServices
import AssetsLibrary
import AVFoundation
import Parse
import ParseUI

class VideoPlayerViewController: UIViewController {

  var videoUrl: NSURL!
  var file: PFFile!

    override func viewDidLoad() {
        super.viewDidLoad()


      // navigation
      let backButtonCustom = UIButton( frame: CGRectMake(0, 0, 22, 22))
      let backIcon = UIImage(named: "0836-arrow-left")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
      backButtonCustom.setImage(backIcon, forState: UIControlState.Normal)
      backButtonCustom.addTarget(self, action: #selector(ReqDataEntryLgViewController.doneButtonTapped), forControlEvents: UIControlEvents.TouchUpInside)
      navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButtonCustom)

      let doneButton = UIBarButtonItem(title: "Done", style: .Done, target: self, action: #selector(ReqDataEntryLgViewController.doneButtonTapped))
      self.navigationItem.setRightBarButtonItems([doneButton], animated: true)




      // video player

      let playerController = AVPlayerViewController()

      self.addChildViewController(playerController)
      self.view.addSubview(playerController.view)
      playerController.view.frame = self.view.frame

      // get data from PFFile in database
      file!.getDataInBackgroundWithBlock({
        (movieData: NSData?, error: NSError?) -> Void in
        if (error == nil) {

                    let documentsPath : AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true)[0]
          let destinationPath:NSString = documentsPath.stringByAppendingString("/file.mov")

          let filemanager = NSFileManager.defaultManager()
          do {
             try filemanager.removeItemAtPath(destinationPath as String)
          } catch  {
            print("Ooops! Something went wrong: \(error)")
          }

          // write to local file
          movieData!.writeToFile ( destinationPath as String, atomically:true)

//          do {
//            let attr : NSDictionary? = try NSFileManager.defaultManager().attributesOfItemAtPath(destinationPath as String)
//            
//            if let _attr = attr {
//              let fileSize = _attr.fileSize()
//              print ("Movie Size \(fileSize)" )
//            }
//          } catch {
//            print("Ooops! Something went wrong getting size: \(error)")
//          }

          let playerItem = AVPlayerItem(asset: AVAsset(URL: NSURL(fileURLWithPath: destinationPath as String)))
          let player = AVPlayer(playerItem: playerItem)
          playerController.player = player
          player.play()
        } else {
          print ("error on getting movie data \(error?.localizedDescription)")
        }
      })




  }


  func doneButtonTapped(){

    navigationController?.popViewControllerAnimated(true)
  }

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



}
lguerra10
  • 249
  • 3
  • 5