新增一個NSObject類,在.h文件中創建一個類方法
+ (UIImage*) thumbnailImageForVideo:(NSURL*)videoURL atTime:(NSTimeInterval*)time;
然后在.m文件中實現方法
+ (UIImage*) thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time {
AVURLAsset *asset = [[[AVURLAsset alloc] initWithURL:videoURL options:nil] autorelease];
NSParameterAssert(asset);
AVAssetImageGenerator *assetImageGenerator = [[[AVAssetImageGenerator alloc] initWithAsset:asset] autorelease];
assetImageGenerator.appliesPreferredTrackTransform = YES;
assetImageGenerator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
CGImageRef thumbnailImageRef = NULL;
CFTimeInterval thumbnailImageTime = time;
NSError *thumbnailImageGenerationError = nil;
thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) actualTime:NULL error:&thumbnailImageGenerationError];
if (!thumbnailImageRef)
NSLog(@"thumbnailImageGenerationError %@", thumbnailImageGenerationError);
UIImage *thumbnailImage = thumbnailImageRef ? [[[UIImage alloc] initWithCGImage:thumbnailImageRef] autorelease] : nil;
return thumbnailImage;
}
如果你要獲取任意幀的圖片
獲取任意幀就要設定這個
assetImageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
assetImageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
加到上述類方法中,這個時候如果改變NSTimeInterval:time 這個參數可獲取任意幀的圖片
這個時候要獲取具體的幀數
//獲取每秒多少幀
float fps = [[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] nominalFrameRate];
//重寫CMTimeMake(a,b) a當前第幾幀, b每秒鐘多少幀.當前播放時間a/b CMTimeMakeWithSeconds(a,b) a當前時間,b每秒鐘多少幀.
CMTime inTime = CMTimeMake(1,60),當前第1幀,一秒60幀,當前時間 1/60
這個時候inTime 替換
thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) actualTime:NULL error:&thumbnailImageGenerationError];
中CMTimeMaket
這個時候即可獲取第N幀圖片。
注意這個方法只支持網絡連接為mp4等可下載連接.或者本地視頻文件。
至于m3u8可用作直播流的連接,不可直接獲取幀圖片,解壓的.ts文件也不可通過此方法獲取幀圖片。可用ffmpeg來獲取圖片,之后嘗試了,再發表一篇文章來介紹。
另外,提供一個思路,如果是直播要獲取第一幀圖片,有的直播SDK可能會提供,有的是服務器直接提供一張圖片,有的用ffmpeg獲取第一幀圖片(相對比較麻煩),實時請求,實時更新圖片,我抓取了戰旗TV的數據接口,首頁主播們的圖片都是實時請求,給的一張實時圖片。