Objective-C中获取视频指定帧的方法

时间:2022-01-06 04:55:03

做项目遇到的需求,用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;
});
});

这样就可以实现这个功能了。