我试图在视频消息气泡 (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/