在iOS端使用AVSampleBufferDisplayLayer进行视频渲染


目前大多数iOS端的视频渲染都使用OpenGLES,但如果仅仅为了渲染而不做其他的例如美颜等效果,其实可以使用iOS8.0新出的AVSampleBufferDisplayLayer。对AVSampleBufferDisplayLayer,官方说明中有一句话,“The AVSampleBufferDisplayLayer class is a subclass of CALayer that displays compressed or uncompressed video frames.”,即AVSampleBufferDisplayLayer既可以用来渲染解码后的视频图片,也可以直接把未解码的视频帧送给它,完成先解码再渲染出去的步骤。


由于本人在使用AVSampleBufferDisplayLayer之前已经videotoolbox中相关api完成了h264视频的硬解,所以这里仅仅使用AVSampleBufferDisplayLayer来渲染,即送给它pixelBuffer。


个人选择了UIImageView作为渲染的view(没有直接使用UIView的原因后面会提到),而且也没有重载UIView的layerClass函数来使AVSampleBufferDisplayLayer成为这个view的默认layer(不这么做的原因后面提到)。


具体做法,首先,建立AVSampleBufferDisplayLayer并把它添加成为当前view的子layer:

self.sampleBufferDisplayLayer = [[AVSampleBufferDisplayLayer alloc] init];
self.sampleBufferDisplayLayer.frame = self.bounds;
self.sampleBufferDisplayLayer.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
self.sampleBufferDisplayLayer.videoGravity = AVLayerVideoGravityResizeAspect;
self.sampleBufferDisplayLayer.opaque = YES;
[self.layer addSublayer:self.sampleBufferDisplayLayer];
其次,把得到的pixelbuffer包装成CMSampleBuffer并设置时间信息:

//把pixelBuffer包装成samplebuffer送给displayLayer
- (void)dispatchPixelBuffer:(CVPixelBufferRef) pixelBuffer
{
    if (!pixelBuffer){
        return;
    }
    @synchronized(self) {
        if (self.previousPixelBuffer){
            CFRelease(self.previousPixelBuffer);
            self.previousPixelBuffer = nil;
        }
        self.previousPixelBuffer = CFRetain(pixelBuffer);
    }
    
    //不设置具体时间信息
    CMSampleTimingInfo timing = {kCMTimeInvalid, kCMTimeInvalid, kCMTimeInvalid};
    //获取视频信息
    CMVideoFormatDescriptionRef videoInfo = NULL;
    OSStatus result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &videoInfo);
    NSParameterAssert(result == 0 && videoInfo != NULL);
    
    CMSampleBufferRef sampleBuffer = NULL;
    result = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault,pixelBuffer, true, NULL, NULL, videoInfo, &timing, &sampleBuffer);
    NSParameterAssert(result == 0 && sampleBuffer != NULL);
    CFRelease(pixelBuffer);
    CFRelease(videoIn
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 您好!关于您提到的问题,可能原因有以下几个:1.视频格式不支持,2.视频文件路径不正确,3.视频文件下载不完整或损坏。建议您先检查您的视频文件是否可以在其他设备或浏览器上正常播放。如果可以,再检查一下代码中的视频路径和格式是否正确。如果还是无法解决问题,可以提供更多细节信息,以便更好地帮助您解决问题。谢谢! ### 回答2: 在iOS使用video标签播放视频失败可能有多个原因。以下是一些可能的原因和解决方案: 1. 浏览器兼容性问题:iOS系统使用的是Safari浏览器,它对于video标签的支持可能受到限制。首先,确保你使用的是最新版本的Safari浏览器。如果问题仍然存在,尝试使用其他第三方浏览器或者通过WebView组件来播放视频。 2. 视频格式不受支持:iOS通常支持播放常见的视频格式,如MP4。确保你的视频文件使用的是受支持的格式,并且编码设置正确。如果不确定视频格式是否正确,可以尝试使用其他格式进行测试。 3. 媒体服务器配置问题:如果你的视频是从远程媒体服务器加载的,确保服务器的配置正确。特别是检查MIME类型是否正确设置为video/mp4或其他支持的视频格式。 4. 网络连接问题:如果你的网络连接不稳定或者速度较慢,可能会导致视频加载失败。尝试连接其他稳定快速的网络来检查问题是否解决。 5. JavaScript或CSS代码问题:检查你的代码中是否有语法错误或者逻辑问题,可能会导致视频无法正确加载或播放。 如果以上解决方案都没有解决问题,建议查阅相关的开发文档,尝试通过调试工具来查找具体的错误信息和解决方案。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值