ios - 显示在 JSQMessagesViewController 中发送的视频的图像预览

标签 ios swift firebase video jsqmessagesviewcontroller

我试图在视频消息气泡 (JSQVideoMediaItem) 中显示用户发送的视频的图像预览,但我的代码只显示黑色预览。 我确信当我使用函数 generateThumbnail() 来获取从 Firebase 发送的视频文件时,它可以完美地工作。 我使用 Firebase 存储,当用户发送视频时,我将其存储在 Firebase 中,因此预览会从 Firebase 存储中选择正确的视频文件,我使用 print(previewImage) 对其进行了测试。

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell
    let message = messages[indexPath.item]

    if !message.isMediaMessage {
        if message.senderId == senderId {
            cell.textView.textColor = UIColor.white
        } else {
            cell.textView.textColor = UIColor.black
        }
    } else if message.isMediaMessage {
        if let media = message.media as? JSQVideoMediaItem {
            var imagePreview = generateThumbnail(url: (media.fileURL)!)
            let imageView = UIImageView(image: imagePreview)
            imageView.backgroundColor = UIColor.clear
            imageView.frame = CGRect(x: 0.0, y: 0.0, width: view.frame.size.width, height: view.frame.size.height)
            imageView.contentMode = .center
            imageView.clipsToBounds = true
            JSQMessagesMediaViewBubbleImageMasker.applyBubbleImageMask(toMediaView: imageView, isOutgoing: false)
        }
    }
    return cell
}

func generateThumbnail(url: URL) -> UIImage? {
    do {
        let asset = AVURLAsset(url: url)
        let imageGenerator = AVAssetImageGenerator(asset: asset)
        imageGenerator.appliesPreferredTrackTransform = true
        let time: CMTime = CMTimeMake(1, 1)
        let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
        return UIImage(cgImage: cgImage)
    } catch {
        print(error.localizedDescription)
        return nil
    }
}

我希望有人能帮助我

最佳答案

我为此做了扩展

    extension JSQVideoMediaItem {

    func addThumbnail() {

        var img: UIImage? = nil

        /// create thumbnail

            do {
                let asset = AVURLAsset(url: self.fileURL)
                let imgGenerator = AVAssetImageGenerator(asset: asset)
                imgGenerator.appliesPreferredTrackTransform = true

                let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0,1), actualTime: nil)
                img = UIImage(cgImage: cgImage)
            }
            catch let error as NSError {
                print("Image generator error :  \(error.localizedDescription)")
            }

        /// create thumbnail END

        let size:CGSize = self.mediaViewDisplaySize()

        let playIcon = UIImage.jsq_defaultPlay()?.jsq_imageMasked(with: .white)
        let imageView:UIImageView = UIImageView(image: playIcon)
        imageView.frame = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
        imageView.contentMode = UIViewContentMode.center
        imageView.clipsToBounds = true
        JSQMessagesMediaViewBubbleImageMasker.applyBubbleImageMask(toMediaView: imageView, isOutgoing: self.appliesMediaViewMaskAsOutgoing)

        if (img != nil) {
            let thumbnailImageView:UIImageView = UIImageView(image: img)
            thumbnailImageView.frame = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
            thumbnailImageView.contentMode = UIViewContentMode.scaleAspectFill
            thumbnailImageView.clipsToBounds = true
            JSQMessagesMediaViewBubbleImageMasker.applyBubbleImageMask(toMediaView: thumbnailImageView, isOutgoing: self.appliesMediaViewMaskAsOutgoing)

            imageView.backgroundColor = .clear
            thumbnailImageView.addSubview(imageView)
            self.cachedVideoImageView = thumbnailImageView;

        }
        else {
            imageView.backgroundColor = .black
            self.cachedVideoImageView = imageView
        }
    }
}

在创建 JSQVideoMediaItem 后添加缩略图

vidItem = JSQVideoMediaItem(fileURL: URL(fileURLWithPath: destPath), isReadyToPlay: true)
vidItem?.addThumbnail()

并且您应该将此行 JSQVideoMediaItem.m 移动到 JSQVideoMediaItem.h 以便公开访问

@property (strong, nonatomic) UIImageView *cachedVideoImageView;

希望对大家有用

关于ios - 显示在 JSQMessagesViewController 中发送的视频的图像预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49772623/

相关文章:

ios - 无法使用 swift 类型的参数列表调用方法

iOS - 无法从 switch 语句跳转到此 case 标签?

ios - <<和>>在swift中是什么意思

xcode - 什么是通信错误 : OS_xpc_error in Xcode 6?

ios - self.view 添加 subview ,但让某些 subview 内容不被添加的 subview 覆盖

json - Swift Codable 解码更改 JSON 并忽略某些字段

Firebase 动态链接子域配置

ios - 使用 Firebase 和 Swift 3 结构化数据以比较值

javascript - 等待查询实时更新然后返回值 [Vuex ,Firestore]

ios - UNUserNotificationCenter 链接错误