Ошибка миниатюры произошла в UITableView - PullRequest
0 голосов
/ 28 мая 2018

Я делаю код с этими шагами для получения миниатюры видео YouTube.URL-адрес миниатюры печатается, но также появляется ошибка, указанная ниже:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellRID") as! VideoAdsCell
    let youtubeId = extractYoutubeIdFromLink(link: arrayVideo[indexPath.row].video)

    if let url = URL(string: "http://img.youtube.com/vi/\(youtubeId!)/1.jpg") {
        print(url)

        let thumbnail = getThumbnailFrom(path: url)
        print(thumbnail as Any)

        cell.imageForMain.image = thumbnail
        cell.viewForMain.layer.masksToBounds = false
        cell.viewForMain.layer.shadowOffset = CGSize(width: -1, height: 1)
        cell.viewForMain.layer.shadowRadius = 1
        cell.viewForMain.layer.shadowOpacity = 1
        cell.viewForMain.layer.cornerRadius = 8
    }

    return cell
}

Я использую эту функцию для миниатюры видео.Но я получаю ошибку.

URL-адрес изображения: http://img.youtube.com/vi/XHEa9Zu9qsc/1.jpg

Ошибка: Ошибка создания эскиза: невозможно открыть

func getThumbnailFrom(path: URL) -> UIImage? {
    do {
        let asset = AVURLAsset(url: path , options: nil)
        let imgGenerator = AVAssetImageGenerator(asset: asset)
        imgGenerator.appliesPreferredTrackTransform = true
        let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil)
        let thumbnail = UIImage(cgImage: cgImage)

        return thumbnail

    } catch let error {
        print("*** Error generating thumbnail: \(error.localizedDescription)")
        return nil
    }
}

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

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

Более того, нет необходимости вAVURLAsset, если вы просто хотите загрузить изображение и отобразить его как UIImage.Вы можете просто использовать URLSession.dataTask для загрузки изображения.

Вы можете использовать это расширение UIImage для асинхронной загрузки изображения:

extension UIImage {
    static func downloadFromRemoteURL(_ url: URL, completion: @escaping (UIImage?,Error?)->()) {
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil, let image = UIImage(data: data) else {
                DispatchQueue.main.async {
                    completion(nil,error)
                }
                return
            }
            DispatchQueue.main.async {
                completion(image,nil)
            }
        }.resume()
    }
}

Затем используйте его для получения уменьшенного изображения, например:это:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellRID") as! VideoAdsCell
    let youtubeId = extractYoutubeIdFromLink(link: arrayVideo[indexPath.row].video)

    if let url = URL(string: "http://img.youtube.com/vi/\(youtubeId!)/1.jpg") {
        print(url)
        UIImage.downloadFromRemoteURL(url, completion: { thumbnail,error in
            guard let thumbnail = thumbnail, error == nil else {
                print(error)
                return
            }
            cell.imageForMain.image = thumbnail
            cell.viewForMain.layer.masksToBounds = false
            cell.viewForMain.layer.shadowOffset = CGSize(width: -1, height: 1)
            cell.viewForMain.layer.shadowRadius = 1
            cell.viewForMain.layer.shadowOpacity = 1
            cell.viewForMain.layer.cornerRadius = 8
        }
    }

    return cell
}
0 голосов
/ 28 мая 2018

Если вы используете youtube API, который не дает вам ссылку на миниатюру видео?

Я вижу, что URL, который вы передаете, чтобы получить миниатюру, уже является URL-адресом миниатюры, поэтому вам не нужно ничего делать.Причина вашей ошибки в том, что вы передаете URL-адрес изображения AVURLAsset, который вместо этого ожидает URL-адрес видео.Поэтому он не может быть открыт.

Вам просто нужно использовать SDWebImage или любую другую стороннюю библиотеку для показа изображения на imageView.Он обрабатывает кеш и выполняет асинхронную загрузку самостоятельно.

Пример SDWebImage :

cell.imageForMain.sd_setImage(with: URL(string: "http://img.youtube.com/vi/\(youtubeId!)/1.jpg"), placeholderImage: UIImage(named: "placeholder.png"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...