【问题标题】:AVPLayer to play video from URL in Firebase DatabaseAVPLayer 从 Firebase 数据库中的 URL 播放视频
【发布时间】:2017-08-26 14:15:18
【问题描述】:

我有可以自动从 Firebase 数据库中提取文本的原型单元格。我也想将视频合并到其中。我将如何使用 AVPlayer 从 FireBase 数据库中的 URL 播放视频。我希望它尽可能自动化。

我不是一位经验丰富的开发人员,并且在此过程中遇到困难,因此请提供“婴儿级别”的答案。

这是从 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()
    }

}

}

【问题讨论】:

  • 您的意思是需要在单元格内播放视频吗?或者您希望它们在单独的屏幕上播放,使用 AVPlayer 控件(如停止、暂停、音量等)?
  • 我都可以。我只是不知道如何开始。似乎有一个打开新视图的播放按钮会更容易,但我不知道。

标签: ios database firebase avplayer


【解决方案1】:

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

  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 来自哪里?所以我的猜测是快照有这个网址。因此,您需要将新属性添加到您的 Post 对象中,该属性是一个 url。

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

编辑2: 这样做:

let url = posts[indexPath.row].url

EDIT3:

  1. 将第 44 行更改为:

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

let url = URL(string: urlString!)

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

【讨论】:

  • 对。我可以让视频播放。我遇到的困难是将该功能添加到 Firebase 方面。
  • 如何让它自动填充原型单元格中的视频?
  • 在我的回答中回答了您的问题:参见 EDIT 部分。
  • 有道理。谢谢
  • @WP 如果它对您有帮助并且您认为它是正确的并解决了您的问题,请接受答案。让我们保持 stackoverflow 的文化:)
猜你喜欢
  • 2016-10-02
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多