2017-08-26 56 views
1

我有自动从Firebase数据库中提取文本的原型单元格。我也想把视频加入到这个中。我如何使用AVPlayer从FireBase数据库中的URL播放视频。我希望它尽可能地自动化。AVPLayer在Firebase数据库中播放来自网址的视频

我不是一个有经验的开发人员,并且在这方面磕磕绊绊,所以请提供“宝宝级别”答案。

下面是从firebase中拉出单元格的代码。

 // 
// FirebaseVidoes.swift 
// Faces of the Holocaust Photographic History 
// 
// Created by New User on 8/25/17. 
// Copyright © 2017 New User. All rights reserved. 
// 

import UIKit 
import Firebase 
import AVKit 
import AVFoundation 

struct postStruct { 
let title : String! 
let message : String! 
//let image : UIImage! 
} 


class FirebaseVidoes: UITableViewController { 


var posts = [postStruct]() 



override func viewDidLoad() { 
    super.viewDidLoad() 

tableView.backgroundView = UIImageView(image: UIImage(named: 
"polandBackgroundBlur.jpg")) 


    let databaseRef = Database.database().reference() 


databaseRef.child("Posts").queryOrderedByKey().observe(.childAdded, 
with: { 

     snapshot in 

     let snapshotValue = snapshot.value as? NSDictionary 
     let title = snapshotValue?["title"] as? String 
     let message = snapshotValue?["message"] as? String 
     //let image = snapshotValue?["image"] as? UIImage 

     self.posts.insert(postStruct(title: title, message: message) 
, at: 0) 
     self.tableView.reloadData() 


    }) 


    //post() 
    // Do any additional setup after loading the view. 
} 


func post(){ 

    let title = "Title" 
    let message = "Message" 


    let post : [String : AnyObject] = ["title": title as AnyObject, 
             "message": message as 
AnyObject] 


    let databaseRef = Database.database().reference() 

    databaseRef.child("Posts").childByAutoId().setValue(post) 


} 

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


override func tableView(_ tableView: UITableView, 
numberOfRowsInSection section: Int) -> Int { 

    return posts.count 

} 



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

    var cell = tableView.dequeueReusableCell(withIdentifier: "Cell") 

    let label1 = cell?.viewWithTag(1) as! UILabel 
     label1.text = posts[indexPath.row].title 

    let label2 = cell?.viewWithTag(2) as! UILabel 
     label2.text = posts[indexPath.row].message 

    //let image1 = cell?.viewWithTag(3) as! UIImage 
     //image1.UIimage = posts[indexPath.row].image 



    return cell! 

} 




} 

这里是AVPlayer代码:

// VideoTestViewController.swift 
// Faces of the Holocaust Photographic History 
// 
// Created by New User on 8/26/17. 
// Copyright © 2017 New User. All rights reserved. 
// 

import UIKit 
import AVKit 
import AVFoundation 


class VideoTest: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 
@IBAction func watchVideoDidClick(_ sender: Any) { 

    playExternalVideo() 
} 

let videoURL = "SOMEVIDEOURL" 

func playExternalVideo(){ 

    let videoURL = NSURL(string: self.videoURL)! 

    let player = AVPlayer(url: videoURL as URL) 
    let playerViewController = AVPlayerViewController() 

    playerViewController.player = player 

    self.present(playerViewController, animated: true) { 
     () -> Void in 
     playerViewController.player!.play() 
    } 

} 

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


} 

如何合并这些来获取自动填充到单元的影片。

EDIT这里被修改后的代码

//Code Beginning  
    import UIKit 
    import Firebase 
    import AVKit 
    import AVFoundation 

    struct postStruct { 
let title : String! 
let message : String! 
let url : URL! 
//let image : UIImage! 

}

类FirebaseVidoes:{的UITableViewController

var posts = [postStruct]() 



override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.backgroundView = UIImageView(image: UIImage(named: "polandBackgroundBlur.jpg")) 


    let databaseRef = Database.database().reference() 

    databaseRef.child("Posts").queryOrderedByKey().observe(.childAdded, with: { 

     snapshot in 

     let snapshotValue = snapshot.value as? NSDictionary 
     let title = snapshotValue?["title"] as? String 
     let message = snapshotValue?["message"] as? String 
     let url = snapshotValue?["url"] as? URL 
     //let image = snapshotValue?["image"] as? UIImage 

     self.posts.insert(postStruct(title: title, message: message, url: url) , at: 0) 
     self.tableView.reloadData() 




    }) 


    //post() 
    // Do any additional setup after loading the view. 
} 

/* FUNC交(){

let title = "Title" 
    let message = "Message" 


    let post : [String : AnyObject] = ["title": title as AnyObject, 
             "message": message as AnyObject] 


    let databaseRef = Database.database().reference() 

    databaseRef.child("Posts").childByAutoId().setValue(post) 


} */ 

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


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return posts.count 

} 



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

    var cell = tableView.dequeueReusableCell(withIdentifier: "Cell") 

    let label1 = cell?.viewWithTag(1) as! UILabel 
     label1.text = posts[indexPath.row].title 

    let label2 = cell?.viewWithTag(2) as! UILabel 
     label2.text = posts[indexPath.row].message 



    //let image1 = cell?.viewWithTag(3) as! UIImage 
     //image1.UIimage = posts[indexPath.row].image 



    return cell! 




} 

func tableView(_tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    var selectedIndex = indexPath 

    let url = URL(string: "url") 
    let player = AVPlayer(url: url!) 
    let playerViewController = AVPlayerViewController() 
    playerViewController.player = player 
    self.present(playerViewController, animated: true) { 
     playerViewController.player!.play() 
    } 

} 

}

+0

你的意思是你需要发挥在细胞内的视频?或者你想让他们在单独的屏幕上播放AVPlayer控件,如停止,暂停,音量等? –

+0

对我来说都不错。我只是不知道如何开始。似乎有一个打开新视图的播放按钮会更容易,但我不知道。 –

回答

0

尝试此用于示出在一个新的屏幕上:

  1. 导入:AVKit,进口AVFoundation
  2. 然后,当用户点按小区(在TableView中的didSelectRow方法)

    let videoURL = URL(string: "url") 
    let player = AVPlayer(url: videoURL!) 
    let playerViewController = AVPlayerViewController() 
    playerViewController.player = player 
    self.present(playerViewController, animated: true) { 
        playerViewController.player!.play() 
    } 
    

让它在单元格内玩是困难的。正如你所评论的那样,现在这会适合你。

编辑:在回答您的评论的问题: 这应该很容易。当我看到你已经有了这样的:

self.posts.insert(postStruct(title: title, message: message), at: 0) 

这意味着你要添加新的Post对象插入到posts阵列。然后你重新加载数据。

所以现在,我想你的snapshotValue应该有一个网址,对不对?因为如果你说你需要播放视频,那么网址来自哪里?所以我的猜测是快照有这个网址。所以你需要向你的Post对象添加一个url的新属性。

所以现在每个单元格都会包含一个Post对象,它有一个url。当用户点击它时,您只需播放该帖子的网址即可。清楚吗?

EDIT2: 只是这样做:

let url = posts[indexPath.row].url

EDIT3:

  1. 改变你的线44本:

let urlString = snapshotValue?["url"] as? String

let url = URL(string: urlString!)

  • 改变你的didSelect方法是: override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
  • +0

    对。我可以让视频播放。我遇到的困难是将该功能添加到Firebase方面。 –

    +0

    如何让它自动填充原型单元格中的视频? –

    +0

    在我的回答中回答了您的问题:请参阅**编辑**部分。 –