AVPLayer 播放来自 Firebase 数据库中网址的视频



我有原型单元格,可以自动从Firebase数据库中提取文本。我也想将视频合并到其中。如何使用 AVPlayer 播放来自 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.
}

}

如何合并这些以获取自动填充到单元格的视频。

编辑这是修改后的代码

//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 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!


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

}

试试这个在新屏幕上显示:

导入
  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应该有一个URL,对吧?因为如果您说需要播放视频,那么URL从何而来?所以我的猜测是快照有这个网址。因此,您需要将作为 url 的新属性添加到您的 Post 对象中。

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

编辑2: 只需这样做:

let url = posts[indexPath.row].url

编辑3:

  1. 将第 44 行更改为:

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

let url = URL(string: urlString!)

  1. 将你的 didSelect 方法更改为:override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

最新更新