ios网页视频抓取工具(常规获取MP4某一帧画面的方法对m3u8流媒体而言并不适用 )

优采云 发布时间: 2021-12-22 16:09

  ios网页视频抓取工具(常规获取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;

}

复制代码

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线