ios网页视频抓取工具(常规获取MP4某一帧画面的方法对m3u8流媒体而言并不适用 )
优采云 发布时间: 2021-12-22 16:09ios网页视频抓取工具(常规获取MP4某一帧画面的方法对m3u8流媒体而言并不适用
)
传统的获取某帧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;
}
复制代码