从Parse

时间:2016-06-01 08:21:32

标签: swift video parse-platform

一旦我从Parse后端下载视频,我似乎无法播放视频。但是我知道视频效果很好,因为你可以从Chrome播放,但不能从Safari播放(我不知道为什么......)。

我在AVPlayer上播放视频的代码也是正确的,因为我从本地数据库测试了多个NSUrl。

有几篇关于它的帖子证实存在问题,但没有人有答案。

iOS - Can't stream video from Parse Backend

Cant stream video (PFFile) from parse server

如果有人可以帮助我,请提前致谢。

1 个答案:

答案 0 :(得分:0)

秘诀是获取PFFIle数据,使用适当的扩展(mov)在本地保存并对本地文件进行处理。 看看这个条目[来自解析服务器的Cant stream video(PFFile)] [1],第二个anwser。

使用以下代码创建PFFIle:

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

这是播放器的代码

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.
    }



}