2016-06-01 88 views
0

似乎我无法通过Parse后端下载视频流。不过,我知道这些视频运行良好,因为您可以从Chrome播放它,但不能从Safari播放(我不知道为什么......)。从Parse后台下载视频后,无法从视频流下载流式视频

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

关于它的几个帖子确认有问题正在进行,但没有人有答案。

iOS - Can't stream video from Parse Backend

Cant stream video (PFFile) from parse server

在此先感谢如果有人能帮助我。

回答

0

秘诀是获取PFFIle数据,使用正确的扩展名(mov)和本地文件的本地文件保存在本地。 看看这个条目[从解析服务器的无法流视频(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. 
    } 



} 
代码