copyCGImageAtTime 获取视频第一帧错误
2017-10-16 本文已影响197人
炒鸡范
+ (UIImage*)getVideoPreViewImage:(AVAsset *)asset atTimeSec:(double)timeSec
{
if (!asset) {
return nil;
}
//获取视频图像实际开始时间 部分视频并非一开始就是有图像的 因此要获取视频的实际开始片段
AVAssetTrack *videoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
NSArray<AVAssetTrackSegment *> *segs = videoTrack.segments;
if (!segs.count) {
return nil;
}
CMTime currentStartTime = kCMTimeZero;
for (NSInteger i = 0; i < segs.count; i ++) {
if (!segs[i].isEmpty) {
currentStartTime = segs[i].timeMapping.target.start;
break;
}
}
CMTime coverAtTimeSec = CMTimeMakeWithSeconds(timeSec, asset.duration.timescale);
//如果想要获取的视频时间大于视频总时长 或者小于视频实际开始时间 则设置获取视频实际开始时间
if (CMTimeCompare(coverAtTimeSec, asset.duration) == 1 || CMTimeCompare(coverAtTimeSec, currentStartTime) == -1) {
coverAtTimeSec = currentStartTime;
}
AVAssetImageGenerator *assetGen = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
assetGen.requestedTimeToleranceBefore = kCMTimeZero;
assetGen.requestedTimeToleranceAfter = kCMTimeZero;
assetGen.appliesPreferredTrackTransform = YES;
//CMTime coverTime = CMTimeMakeWithSeconds(coverAtTimeSec, asset.duration.timescale);
NSError *error = nil;
CGImageRef image = [assetGen copyCGImageAtTime:coverAtTimeSec actualTime:NULL error:&error];
if (error) {
return nil;
}
UIImage *videoImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
return videoImage;
}