做项目遇到的需求,用WebSocket做IM,用户收到小视频消息后显示的是视频的一张截图,用户点击图片之后开始下载播放。
首先新建获取视频第一帧截图的工具类SDVideoHelper。
#import <Foundation/Foundation.h>
@interface SDVideoHelper : NSObject
/**
* 获取视频第一帧的截图方法
*/
+ (UIImage *)getVideoPreviewImage:(NSString *)videoURL;
@end
#import "SDVideoHelper.h"
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>
@implementation SDVideoHelper
//获取视频第一帧的截图方法
+ (UIImage *)getVideoPreviewImage:(NSString *)videoURL
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videoURL] options:nil];
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0.0, 600);
NSError *error = nil;
CMTime actualTime;
CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage *thumb = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
return thumb;
}
@end
调用的时候如下
// 小视频缩略图
CXIMVideoMessageBody *body = (CXIMVideoMessageBody *)message.body;
// 异步获取缩略图
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:body.localUrl];
UIImage *prevImage = [SDVideoHelper getVideoPreviewImage:filePath];
dispatch_async(dispatch_get_main_queue(), ^{
self.videoImageView.image = prevImage;
});
});
这样就可以实现这个功能了。