博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS获取m3u8流媒体的视频截图
阅读量:6164 次
发布时间:2019-06-21

本文共 2391 字,大约阅读时间需要 7 分钟。

常规获取MP4某一帧画面的方法对m3u8流媒体而言并不适用,如果有需求中需要获取m3u8流媒体截图的小伙伴可以看一下这个方法。

首先,用AVPlayer创建一个视频播放器,并且对AVPlayerItem添加观察者,具体代码不在这里啰嗦了。

流媒体的某一帧在流媒体播放时才能获取,所以我们在KVO中去调用获取画面的方法:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    AVPlayerItem *playerItem=object;    if ([keyPath isEqualToString:@"status"]) {        AVPlayerStatus status= [[change objectForKey:@"new"] intValue];        if(status==AVPlayerStatusReadyToPlay){            NSLog(@"正在播放...,视频总长度:%.2f",CMTimeGetSeconds(playerItem.duration));            //image即为获取到的视频帧截图            UIImage *image = [self getPixelBufferForItem:playerItem];        }    }}复制代码

获取视频帧的代码:

//获取m3u8视频帧画面- (UIImage *)getPixelBufferForItem:(AVPlayerItem *)playerItem{    AVPlayerItemVideoOutput *output = [[AVPlayerItemVideoOutput alloc] init];    [playerItem addOutput:output];    CVPixelBufferRef ref =[output copyPixelBufferForItemTime:CMTimeMake(1000, 60) itemTimeForDisplay:nil];    UIImage *image = [self CVImageToUIImage:ref];    return image;}复制代码

copyPixelBufferForItemTime: itemTimeForDisplay:这个方法获取到的视频帧是CVPixelBufferRef类型,我们需要将CVPixelBufferRef类型转化为UIImage类型

//CVPixelBufferRef转UIImage- (UIImage *)CVImageToUIImage:(CVPixelBufferRef)imageBuffer{    CVPixelBufferLockBaseAddress(imageBuffer, 0);    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);    size_t width = CVPixelBufferGetWidth(imageBuffer);    size_t height = CVPixelBufferGetHeight(imageBuffer);    size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);    size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);        CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize, NULL);        CGImageRef cgImage = CGImageCreate(width, height, 8, 32, bytesPerRow, rgbColorSpace, kCGImageAlphaNoneSkipFirst|kCGBitmapByteOrder32Little, provider, NULL, true, kCGRenderingIntentDefault);            UIImage *image = [UIImage imageWithCGImage:cgImage];        CGImageRelease(cgImage);    CGDataProviderRelease(provider);    CGColorSpaceRelease(rgbColorSpace);        NSData* imageData = UIImageJPEGRepresentation(image, 1.0);    image = [UIImage imageWithData:imageData];    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);    return image;}复制代码

转载于:https://juejin.im/post/5a3334306fb9a045167d3b83

你可能感兴趣的文章
Azure: 给 ubuntu 虚机挂载数据盘
查看>>
BugkuCTF web3
查看>>
僵尸进程、孤儿进程
查看>>
413 Request Entity Too Large
查看>>
VCL组件之重要的公用属性
查看>>
异常球称重问题
查看>>
java 十六进制数的转换
查看>>
Divide and conquer method
查看>>
[sharepoint]根据用户名获取该用户的权限
查看>>
多线程模拟实现生产者/消费者模型 (借鉴)
查看>>
iOS开发需要哪些图片?
查看>>
命令行远程链接MySQL
查看>>
logstash向elasticsearch写入数据,如何指定多个数据template
查看>>
Node.js:Web模块、文件系统
查看>>
【转】灵活运用 SQL SERVER FOR XML PATH
查看>>
WCF角色服务
查看>>
常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别
查看>>
已开源|码上用它开始Flutter混合开发——FlutterBoost
查看>>
原地踏步 – 没有突破高效理念的结果
查看>>
“间谍”软件克星Ad-Aware
查看>>