AVPLayer在Firebase数据库中播放来自网址的视频
我有自动从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()
}
}
}
尝试此用于示出在一个新的屏幕上:
- 导入:AVKit,进口AVFoundation
-
然后,当用户点按小区(在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:
- 改变你的线44本:
let urlString = snapshotValue?["url"] as? String
let url = URL(string: urlString!)
- 改变你的didSelect方法是:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
对。我可以让视频播放。我遇到的困难是将该功能添加到Firebase方面。 –
如何让它自动填充原型单元格中的视频? –
在我的回答中回答了您的问题:请参阅**编辑**部分。 –
你的意思是你需要发挥在细胞内的视频?或者你想让他们在单独的屏幕上播放AVPlayer控件,如停止,暂停,音量等? –
对我来说都不错。我只是不知道如何开始。似乎有一个打开新视图的播放按钮会更容易,但我不知道。 –