2013-09-09 5 views
6

я должен извлечь миниатюру из видео (от URL), и я использую этот код:Извлечение эскизов из видео URL

NSString *stringUrl = video.stringurl; 
NSURL *url = [NSURL URLWithString:stringUrl]; 

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; 
[imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero]; 
[imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero]; 

CGImageRef imageRef = [imageGenerator copyCGImageAtTime:playerCurrentTime actualTime:&actualtime error:&error]; 
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; 

CGImageRelease(imageRef); 

Но когда-нибудь у меня есть ошибка с copyCGImageAtTime и миниатюра не генерируется. Ошибка: Error save image Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"(OSStatus error -12792.)", NSLocalizedFailureReason=An unknown error occurred (-12792)}

Вот link, которую я прочитал решение, но если потребительная fileURLWithPath: вместо URLWithString: метод добавления к концу URL-адрес ап «- файл: // локальный /», что аннулирует URL-адрес. Поэтому я не знаю, что я могу сделать.

+1

вы нашли решение? – aykutt

+0

@ anna565 Вы нашли решение? У меня такая же ошибка, но я не могу понять, почему это происходит. – Sam

+0

@aykutt Вы нашли решение? У меня такая же ошибка, но я не могу понять, почему это происходит. – Sam

ответ

2

на одном из моего приложения я уже захватил изображение из URL видео, как это:

MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease]; 
UIImage *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; 

просто передавая объект URL-адрес, как videoURL и с использованием MPMoviePlayerController я успешно в состоянии иметь изображение все время. надеюсь, вы тоже сможете это сделать с помощью этого простого кода

+1

У меня есть AVPlayer – Anna565

+0

, вы должны указать, что ... добавил тег. –

+1

К сожалению, я добавил тэг – Anna565

5

Если вы используете MPMoviePlayerController, то вы можете использовать этот код для генерации эскизов из URL-адреса видео.

NSString *stringUrl = video.stringurl; 
NSURL *url = [NSURL URLWithString:stringUrl]; 
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame]; 

Но, используя этот код, плеер начнет воспроизведение звука автовоспроизведения. Таким образом, вы должны остановить игрока с этим кодом:

//Player autoplays audio on init 
[player stop]; 

Update:

Ошибка сохранения Ошибка изображения Domain = AVFoundationErrorDomain Код = -11800 «Операция может не быть завершено "(ошибка OSStatus -12792.)", NSLocalizedFailureReason = Неизвестная ошибка (-12792)}

Ошибка, вероятно, связана с использованием URLWithString. Я думаю, вы должны использовать -fileURLWithPath вместо URLWithString.

Пример кода:

NSString *stringUrl = video.stringurl; 
NSURL *vidURL = [NSURL fileURLWithPath:stringUrl]; 

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidURL options:nil]; 
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 

NSError *err = NULL; 
CMTime time = CMTimeMake(1, 60); 

CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err]; 
UIImage *thumbnail = [UIImage imageWithCGImage:imgRef]; 
+1

Спасибо, но у меня уже есть AVPlayer, а не MPMoviePlayer – Anna565

+1

@ Anna565: Проверить ** Обновить ** в моем ответе. – Bhavin

+1

Я знаю, как я могу извлечь миниатюру из AVPlayer, проблема в том, что метод, который я использую, иногда работает, но иногда дает ошибку. В этом и заключается проблема – Anna565

2

Если вы используете AVPlayer, вы можете получить миниатюру, как это:

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 
+1

Это точно тот же код, который я использовал и иногда работает, но иногда у меня есть ошибка, и эскиз не генерируется – Anna565

+0

@ Anna565 да иногда это работает, а иногда и нет .. Почему эта ошибка? – Sam

+0

@sam, я не уверен. Вы пытались асинхронно, а затем возвращались по почте? –

4

Я пытаюсь так, чтобы захватить скриншот из ЗОЖ переменный поток битрейта, IE M3U8, и ни один из предложенных здесь методов не работал для меня.

В конце концов я добился успеха. Прежде всего, необходимо приложить AVPlayerItemVideoOutput к плееру:

self.playerAV = [AVPlayer playerWithURL:localURL]; 

    NSDictionary* settings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] }; 
    AVPlayerItemVideoOutput* output = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:settings]; 
    [self.playerAV.currentItem addOutput:output]; 

Теперь, когда вы хотите захватить скриншот:

CVPixelBufferRef pixelBuffer = [output copyPixelBufferForItemTime:player.currentTime itemTimeForDisplay:nil]; 
      CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; 

      CIContext *temporaryContext = [CIContext contextWithOptions:nil]; 
      CGImageRef videoImage = [temporaryContext 
            createCGImage:ciImage 
            fromRect:CGRectMake(0, 0, 
                 CVPixelBufferGetWidth(pixelBuffer), 
                 CVPixelBufferGetHeight(pixelBuffer))]; 

      image = [UIImage imageWithCGImage:videoImage]; 
      image = [image cropImageToSize:maxSize withProportionDiffLargerThan:IMAGE_PROPORTION_DIFF]; 

      if (videoImage) 
      { 
       CGImageRelease(videoImage); 
      } 
+0

treid это, но его не работает !! Я использую hls. Подумайте, в чем проблема? –

+0

Что значит «не работает»? Какая версия ОС? Какое устройство? – Vaiden

2

AVAssetImageGenerator не работает для HSL видео.

Мне удалось получить изображение из видео HSL, используя пример кода ниже.

Пример кода:

CMTime currentTime = _player.currentItem.currentTime; 
CVPixelBufferRef buffer = [_videoOutput copyPixelBufferForItemTime:currentTime itemTimeForDisplay:nil]; 
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:buffer]; 
UIImage *thumbImage = [UIImage imageWithCIImage:ciImage];