簡體   English   中英

UITableViewCell中的AVPlayer是黑色的,無法查看

[英]AVPlayer in UITableViewCell is black and can't view

我已經瀏覽了每篇文章和文章,但還沒有解決我的問題,我不知道為什么。 我有一個表格視圖,如果內容是圖像,它將在 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。

我也得到下面的錯誤代碼。 我查看並認為這意味着該文件不存在,但我仍然可以在其他視圖中查看該文件,該文件在其他視圖中播放視頻。

NSURLConnection 以錯誤結束 - 代碼 -1100

這是視頻路徑存儲在數據庫中的位置,根本不使用 Firebase 存儲。 在此處輸入圖片說明

如果您想在 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)

}

@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
    }
}

希望它會幫助您所需的輸出!!!。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM