Я пытаюсь получить эскиз видеоролика. Видео представляет собой поток (HLS) с форматом m3u8. Я уже пробовал запросThumbnailImagesAtTimes из MPMoviePlayerController, но это не сработало. У кого-нибудь есть решение этой проблемы? Если да, то как вы это сделали?
Создание эскизов видеоролика в IPhone SDK
Ответ 1
Если вы не хотите использовать MPMoviePlayerController
, вы можете сделать это:
AVAsset *asset = [AVAsset assetWithURL:sourceURL];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
CMTime time = CMTimeMake(1, 1);
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef); // CGImageRef won't be released by ARC
Вот пример в Swift:
func thumbnail(sourceURL sourceURL:NSURL) -> UIImage {
let asset = AVAsset(URL: sourceURL)
let imageGenerator = AVAssetImageGenerator(asset: asset)
let time = CMTime(seconds: 1, preferredTimescale: 1)
do {
let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
return UIImage(CGImage: imageRef)
} catch {
print(error)
return UIImage(named: "some generic thumbnail")!
}
}
Я предпочитаю использовать AVAssetImageGenerator
над MPMoviePlayerController
, потому что он потокобезопасен, и вы можете иметь более одного экземпляра за раз.
Ответ 2
Получите эскиз видеоролика.
NSString *strVideoURL = @"http://www.xyzvideourl.com/samplevideourl";
NSURL *videoURL = [NSURL URLWithString:strVideoURL] ;
MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
player = nil;
Замените строку вашего видео URL strVideoURL
.
Вы получите миниатюру в виде вывода из video
.
И миниатюрами являются данные типа UIImage
!
Ответ 3
-(UIImage *)loadThumbNail:(NSURL *)urlVideo
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:urlVideo options:nil];
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generate.appliesPreferredTrackTransform=TRUE;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 60);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
NSLog(@"err==%@, imageRef==%@", err, imgRef);
return [[UIImage alloc] initWithCGImage:imgRef];
}
Добавьте AVFoundation
framework в свой проект и не забудьте импортировать <AVFoundation/AVFoundation.h>
, и вам необходимо передать путь вашего видео, сохраненного в каталоге документа, в качестве параметра и получить изображение как UIImage
.
Ответ 4
вы можете получить миниатюру с вашего видеоролика с использованием ниже кода
MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
Ответ 5
Возможно, это полезно для кого-то, кто сталкивается с той же проблемой. Мне нужно было простое решение для создания миниатюры для изображений, PDF файлов и видео. Чтобы решить эту проблему, я создал следующую библиотеку (в Swift).
https://github.com/prine/ROThumbnailGenerator
Использование очень просто: var thumbnailImage = ROThumbnail.getThumbnail(url)
Он имеет три разных реализации и в зависимости от расширения файла создает миниатюру. Вы можете легко добавить свою собственную реализацию, если вам нужен создатель миниатюр для другого расширения файла.
Ответ 6
Версия Swift 3:
func createThumbnailOfVideoFromFileURL(videoURL: String) -> UIImage? {
let asset = AVAsset(url: URL(string: videoURL)!)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
let time = CMTimeMakeWithSeconds(Float64(1), 100)
do {
let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
let thumbnail = UIImage(cgImage: img)
return thumbnail
} catch {
// Set a default image if Image is not acquired
return UIImage(named: "ico_placeholder")
}
}
Ответ 7
Для Swift 3.0:
func generateThumbnailForVideoAtURL(filePathLocal: NSString) -> UIImage? {
let vidURL = NSURL(fileURLWithPath:filePathLocal as String)
let asset = AVURLAsset(url: vidURL as URL)
let generator = AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform = true
let timestamp = CMTime(seconds: 1, preferredTimescale: 60)
do {
let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil)
let frameImg : UIImage = UIImage(cgImage: imageRef)
return frameImg
} catch let error as NSError {
print("Image generation failed with error ::\(error)")
return nil
}
}
Ответ 8
Код Swift 2 с AVAssetImageGenerator:
func thumbnailImageForVideo(url:NSURL) -> UIImage?
{
let asset = AVAsset(URL: url)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
var time = asset.duration
//If possible - take not the first frame (it could be completely black or white on camara videos)
time.value = min(time.value, 2)
do {
let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
return UIImage(CGImage: imageRef)
}
catch let error as NSError
{
print("Image generation failed with error \(error)")
return nil
}
}