Видео, отображаемые в виде черных ящиков в снимках UIImage WKWebView - PullRequest
2 голосов
/ 20 февраля 2020

Я собираю содержимое WKWebView в UIImage через CALayer, используя следующее расширение к UIImage:

extension UIImage {
   class func imageFromLayer(layer: CALayer) -> UIImage {
      UIGraphicsBeginImageContextWithOptions(layer.bounds.size, layer.isOpaque, 0.0)
      layer.render(in: UIGraphicsGetCurrentContext()!)
      let img = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()
      return img!
   }
}

Когда я рендерим захваченное изображение в UIImageView, я вижу все из веб-вида в виде изображения; все, кроме видео, содержимое которого отображается в виде черного ящика. Я сталкиваюсь с той же проблемой, если использую функцию WKWebView takeSnapshot или функцию drawHierarchy класса UIView для захвата UIImage веб-представления. Кто-нибудь знает, почему видео отображаются в виде черных ящиков и как это можно исправить?

Обновление 1: Кроме того, все GIF-изображения в изображениях Google заморожены до щелчка. GIF можно разморозить, щелкнув по нему, после чего его размер изменяется, чтобы занять весь экран и начинается цикл.

Обновление 2: Я читал, что программное обеспечение для записи OBS иногда та же проблема возникает при захвате видео, когда используемый браузер использует аппаратное ускорение. Я также читал, что WKWebView использует аппаратное ускорение. Есть ли способ отключить аппаратное ускорение в WKWebView, чтобы попробовать это? В качестве альтернативы, UIWebView использует аппаратное ускорение?

Обновление 3: Существует еще одна запись , сообщающая о подобной проблеме. Постер сообщает, что весь контент, отображаемый с помощью графического процессора, выглядит черным на его снимках экрана, и он считает, что проблема связана с аппаратным ускорением.

Обновление 4: При использовании функции быстрого просмотра Xcode, которую я наблюдал что слой, который передается в imageFromLayer, не содержит видео (т. е. видео уже представлены как черные ящики в переданном в слое). Это заставляет меня думать, что WKWebView не отображает видео на тот же слой, что и другой его контент. Это также заставляет меня думать, что, если бы я мог получить доступ к этому гипотетическому слою видео, я смог бы объединить два снимка, чтобы сформировать снимок всего веб-представления.

Обновление 5: Я пытался изменив мою функцию imageFromLayer, чтобы она взяла UIView вместо CALayer, чтобы я мог передать WKWebView напрямую. Модифицированная версия показана ниже, но она не решила проблему не отображаемых видео. Тем не менее, с помощью функции «быстрого просмотра» Xcode я смог заметить, что видео уже отсутствует в UIView переданного в WKWebView объекта.

class func createImage(view: UIView) -> UIImage {
   UIGraphicsBeginImageContextWithOptions(view.frame.size, view.isOpaque, 0.0)
   view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
   let rasterizedView = UIGraphicsGetImageFromCurrentImageContext()!
   UIGraphicsEndImageContext()
   return rasterizedView
}

Update 6: Попытка захвата веб-вида с помощью UIWindow, в котором он содержится, также приводит к тому, что видео не захватывается. Я использовал приведенный ниже код (обратите внимание, что keyWindow устарела) и функцию быстрого просмотра Xcode, чтобы проверить эту идею.

let window = UIApplication.shared.keyWindow
let windowLayer = window!.layer
...