【问题标题】:AVPlayer in UITableViewCell is black and can't viewUITableViewCell 中的 AVPlayer 是黑色的,无法查看
【发布时间】:2020-03-08 03:46:55
【问题描述】:

我浏览了所有帖子和文章,但还没有解决我的问题,我不知道为什么。我有一个表格视图,如果内容是图像,它将在 TableViewCell 中显示图像,否则将在其中显示视频。对于视频,我打印了链接,所以它在那里并且链接有效,但由于某种原因,在 TableViewCell 中视频没有播放,它只是黑色。

这是 TableViewCell 的代码:

import UIKit
import AVFoundation

class ViewImageCell: UITableViewCell {

var avQueuePlayer   : AVQueuePlayer?
var avPlayerLayer   : AVPlayerLayer?



let postContentView: UIView = {
    let view = UIView()

    return view
}()

   let contentImageView: UIImageView = {
       let imageView = UIImageView()
       imageView.translatesAutoresizingMaskIntoConstraints = false
       imageView.layer.masksToBounds = true
       imageView.autoresizesSubviews = true
       imageView.contentMode = .scaleAspectFit
       imageView.image = UIImage(named: "ProfileIcon")

      return imageView
   }()


override func awakeFromNib() {
    super.awakeFromNib()


    // Initialization code


}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}


override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: .default, reuseIdentifier: reuseIdentifier)

    addSubview(postContentView)
    addSubview(contentImageView)
    postContentView.anchor(top: self.topAnchor, left: self.leftAnchor, bottom: self.bottomAnchor, right: self.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
    contentImageView.anchor(top: self.topAnchor, left: self.leftAnchor, bottom: self.bottomAnchor, right: self.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
}


   required init?(coder aDecoder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
   }

func addPlayer(for url: URL) {
    self.avQueuePlayer = AVQueuePlayer(url: url)
    self.avPlayerLayer = AVPlayerLayer(player: self.avQueuePlayer!)
    self.avPlayerLayer?.frame = self.postContentView.bounds
    self.avPlayerLayer?.fillMode = .both
    self.postContentView.layer.addSublayer(self.avPlayerLayer!)
    self.avQueuePlayer?.play()
}

   func bindData(content: NSDictionary) {

    if content[kPICTURE] != nil {

        let data = content[kPICTURE] as! String
        let picData = NSData(base64Encoded: data, options: [])

        if let image = UIImage(data: picData! as Data) {
            contentImageView.image = image
        } else {
            print("There was an error loading the pic")
        }

    } else {

    }

    if content[kVIDEO] != nil {
        contentImageView.isHidden = true
        let videoData = content[kVIDEO] as! String
           let url = NSURL(fileURLWithPath: videoData)
        addPlayer(for: url as URL)
           print("Here is a video")

    } else {
        //
    }

}
}

这是 TableView 的一段代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: imageCellID, for: indexPath) as! ViewImageCell

        if singleContent != nil {

            cell.bindData(content: singleContent)

        } else {
            print("Can't find singleContent")
        }

        return cell
    }




    return UITableViewCell()
}

如果您有任何问题并需要更多说明,请告诉我。非常感谢所有帮助。

编辑:这是我正在使用的视频路径类型的示例。我是从我的 Firebase 数据库中获取的,而不是我项目中的本地文件。

file:///private/var/mobile/Containers/Data/PluginKitPlugin/49C0EAA4-9825-4D06-8CFB-6136FF5BCC3C/tmp/trim.AA010490-81F0-43C8-AE8A-1029D5AF55E1.MOV

我还收到以下错误代码。我看了看,认为这意味着该文件不存在,但我仍然可以在其他地方查看该文件,它在其他视图中播放视频。

NSURLConnection 完成错误 - 代码 -1100

这是视频路径存储在数据库中的位置,根本不使用 Firebase 存储。

【问题讨论】:

  • 你用 webview 试过了吗?
  • 你能分享你用于视频的网址吗?
  • 您是否将观察者添加到 AVPlayer 及其 currentItem 以检查状态是否失败?

标签: swift uitableview avplayer avplayerlayer


【解决方案1】:

如果您想在 webview 中播放视频 URL,请使用以下代码:(根据您的要求管理代码)

func bindData(content: NSDictionary)
{

    if content[kPICTURE] != nil {

        let data = content[kPICTURE] as! String
        let picData = NSData(base64Encoded: data, options: [])

        if let image = UIImage(data: picData! as Data) {
            contentImageView.image = image
        } else {
            print("There was an error loading the pic")
        }

    } else {

    }

    if content[kVIDEO] != nil {
        contentImageView.isHidden = true
        let videoData = content[kVIDEO] as! String

        //let url = NSURL(fileURLWithPath: videoData)


        let storageRef = Storage.storage().reference(forURL: <YourFilePathURL>)
storageRef.getData(maxSize: INT64_MAX) { (data, error) in
    if let error = error {
        print("Error downloading image data: \(error)")
        return
    }
    storageRef.getMetadata(completion: { (metadata, metadataErr) in

        if let error = metadataErr {
            print("Error downloading metadata: \(error)")
            return
        }
        if (metadata?.contentType == "image/gif") {
            print("It is Gif")
        } else {
            let downloadUrl = metadata?.downloadURL()
            if downloadUrl != nil{
 print(downloadUrl)
       //You will get your Video Url Here
        self.PlayVideoInWEbView(downloadUrl)
        print("Here is a video")

    }

        }
    })
}
    } else {
        //
    }

}

func PlayVideoInWEbView(_ videoURL : String)
{
    let myWebView:UIWebView = UIWebView(frame: CGRect(x: 20, y: 20, width: self.viewCell.frame.width, height: 200))



    myWebView.delegate = self

    let myURL = URL(string: videoURL)
    let myURLRequest:URLRequest = URLRequest(url: myURL!)
    myWebView.loadRequest(myURLRequest)

    self.viewCell.addSubview(myWebView)

}

【讨论】:

  • 我已经尝试过您的方法,并且在有链接时效果很好;但是,当我有带路径的视频时,它不起作用。我试图用 NSURL(fileURLWithPath) 改变它,但它仍然没有显示。你知道我可以如何调整它以使其适合我的目的吗?
  • @Jaqueline 如果您的视频存储在本地路径中,那么您需要借助捆绑代码创建 url。如果您有本地视频路径,请查看我更新的答案。
  • 我刚刚用我正在使用的视频路径示例更新了我的问题,该视频路径从我的 Firebase 数据库加载,而不是捆绑资源。非常感谢您的帮助!
  • 您在问题中更新的路径是用于 firebase 文件。因此,如果您直接将此路径调用到 NSURLConnection,那么您将收到 1100 错误。我建议您首先从该路径下载 url,然后在 URL 连接中传递该 url 以播放视频。当您获得正确的 URL 时,您可以通过将该 URL 粘贴到任何浏览器中来检查它,它会正常播放。
  • 您能帮我解释一下这个过程吗?我以前没有这样做过
【解决方案2】:

@Jaqueline 尝试如下如果您已经或将录制的视频存储到本地文档目录中。

func bindData(content: NSDictionary) {

    if content[kPICTURE] != nil {

        let data = content[kPICTURE] as! String
        let picData = NSData(base64Encoded: data, options: [])

        if let image = UIImage(data: picData! as Data) {
            contentImageView.image = image
        } else {
            print("There was an error loading the pic")
        }

    } else {
    }

    if content[kVIDEO] != nil {
        contentImageView.isHidden = true
        //let videoData = content[kVIDEO] as! String

        //let url = NSURL(fileURLWithPath: videoData)

        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
        let url = NSURL(fileURLWithPath: path)
        let filePath = url.appendingPathComponent("/video.mp4")!.path

        let videoData = URL(fileURLWithPath: filePath)

        //addPlayer(for: url as URL) //remove this line and add below line

        self.PlayVideoInWEbView(videoData)
        print("Here is a video")

    } else {
        //
    }
}

func PlayVideoInWEbView(_ videoURL : String) {
    let myWebView:WKWebView = WKWebView(frame: CGRect(x: 20, y: 20, width: self.viewCell.frame.width, height: 200))

    //myWebView.delegate = self

    myWebView.uiDelegate = self
    myWebView.navigationDelegate = self

    let myURL = URL(string: videoURL)
    let myURLRequest:URLRequest = URLRequest(url: myURL!)
    //myWebView.loadRequest(myURLRequest)

    myWebView.load(myURLRequest)

    self.viewCell.addSubview(myWebView)
}

//MARK: - WKNavigationDelegate
extension YourViewControllerClass: WKNavigationDelegate {

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        //Here hide your loading indicator
    }

    func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {

        DDLogDebug("webViewWebContentProcessDidTerminate ==> \(webView)")
    }

    func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
        //Here hide your loading indicator
    }
}

希望它对您所需的输出有所帮助!!!。

【讨论】:

  • 我刚刚用我正在使用的视频路径示例更新了我的问题,该视频路径从我的 Firebase 数据库加载,而不是捆绑资源。非常感谢您的帮助!
  • @Jaqueline 试试WKWebView instead of using UIWebView。将此视频文件file:///private/var/mobile/Containers/Data/PluginKitPlugin/49C0EAA4-9825-4D06-8CFB-6136FF5BCC3C/tmp/trim.AA010490-81F0-43C8-AE8A-1029D5AF55E1.MOV 加载到WKWebView - 希望它会得到您想要的输出。
  • @Jaqueline 我已经更新了我的答案,请检查一下。
  • 感谢您的回复。当我尝试它时,控制台被 [Process] kill() 返回了意外错误 1 ​​蜂拥而至,除了它与 WKWebView 有关外,我不明白这意味着什么。该视频也不会播放,它只是一个白色视图。我尝试在我的单元格中添加一个 AVPlayer,它运行良好,但有一个错误。你觉得你可以看看我的帖子吗? stackoverflow.com/questions/60699431/… 谢谢!
  • @Jaqueline 好的,让我检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多