2016-04-28 5 views
1

У меня есть требование: получить изображение кадра перед воспроизведением потокового видео (m3u8), в качестве дисплея предварительного просмотра видео. Я использую AVPlayerItemVideoOutpucopyPixelBufferForItemTime: itemTimeForDisplay: только при воспроизведении потокового видео, чтобы получить изображение рамки, есть ли у вас другой способ? благодаря!!Как получить изображение кадра перед воспроизведением потокового видео m3u8? iOS

Это мой код:

CMTime itemTime = self.playerItem.currentTime; 
CVPixelBufferRef pixelBuffer = [_playerItemVideoOutput copyPixelBufferForItemTime:itemTime 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))]; 

UIImage *uiImage = [UIImage imageWithCGImage:videoImage]; 
CGImageRelease(videoImage); 
NSLog(@"uiImage:%@", uiImage); 

ответ

2

Как указано в вашем вопросе, AVPlayerItemVideoOutput это путь, НО, видео не нужно играть, он просто должен быть «готов ».

Я создал простую и удобную в использовании утилиту, которая следует этому принципу для извлечения эскизов из удаленных потоков. (https://github.com/acotilla91/ACThumbnailGenerator)

Как использовать:

double bitRate = 1000000; // force video bit rate (can be use to cap video quality and improve performance). Pass 0 to use default bit rate. 
self.thumbnailGenerator = [[ACThumbnailGenerator alloc] initWithPreferredBitRate:bitRate]; 

NSURL *videoURL = [NSURL URLWithString:@"http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"]; 
int position = 10; // video position (in seconds) from where thumbnail should be extracted. Always pass 0 for live streams. 

[self.thumbnailGenerator loadImageFrom:videoURL position:position withCompletionBlock:^(UIImage *image) { 

    // use `image`    

}]; 

Надеется, что это помогает.