ios - 如何在播放 m3u8 视频流之前获取帧图像? iOS

标签 ios iphone video-streaming frame m3u8

我有一个需求:在播放视频流(m3u8)之前获取帧图像,作为视频预览显示。我用AVPlayerItemVideoOutpu copyPixelBufferForItemTime: itemTimeForDisplay: 只在播放视频流的时候用到帧图,请问有其他方法吗?谢谢!!

这是我的代码:

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);

最佳答案

编辑:
我已将此项目转换为 Swift。这是新的 repo ACThumbnailGenerator-Swift .

用法:

var generator: ACThumbnailGenerator!

func captureSomeImage() {
    let streamUrl = URL(string: "https://p-events-delivery.akamaized.net/18oijbasfvuhbfsdvoijhbsdfvljkb6/m3u8/hls_vod_mvp.m3u8")!
    generator = ACThumbnailGenerator(streamUrl: streamUrl)
    generator.delegate = self
    generator.captureImage(at: 300)
}

func generator(_ generator: ACThumbnailGenerator, didCapture image: UIImage, at position: Double) {
    // Use `image`
}

原答案:

正如您在问题中所述,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`            

}];

希望对您有所帮助。

关于ios - 如何在播放 m3u8 视频流之前获取帧图像? iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36904084/

相关文章:

javascript - 如何在 Swift 中获取 UIWebView 中的 JS 值?

ios - HKObserverQuery 失败,授权未确定

iOS 开发工具包。显示通话状态栏

iPhone 上未显示 Python smtplib.sendmail Mime Multipart 正文

encryption - 在 exoplayer android 中使用 AES 在线加密流媒体视频文件

objective-c - 是什么让钥匙串(keychain)项目独一无二(在 iOS 中)?

iphone - 使用基础 sdk 5.0 编译的应用程序可以在 iOS4.x 上运行吗?

iphone - 在 iPhone 上使用图像和相机时出现内存问题

安卓播放器WOWZA服务器RTSP码流问题

xml - 替换 MPEG DASH 视频的片段