IOS硬件解码VTDecompressionSession失效

原文:http://blog.5ibc.net/p/33817.html

编码、解码失效都可以restart一下。

IOS硬件解码VideoToolbox在应用中进入后台VTDecompressionSession失效解决办法

*前段时间在IOS上用VideoToolbox进行视频播放器硬件解码时遇到一个问题,就是播放器进入进入到后台后再切换回来会导致VTDecompressionSession直接失效,这个问题纠结了很久,后来终于找到解决办法了,直接重新初始化session,下面展示一段示例代。 
参考链接 
http://www.zhihu.com/question/20692215 
引用了stevenyao/iOSHardwareDecoder · GitHub的代码,这段代码里面没有对session失效了进行处理,我在里面加了下面这段处理,就可以了。

- (void)resetH264Decoder
{
    if(_deocderSession) {
        VTDecompressionSessionInvalidate(_deocderSession);
        CFRelease(_deocderSession);
        _deocderSession = NULL;
    }
    CFDictionaryRef attrs = NULL;
    const void *keys[] = { kCVPixelBufferPixelFormatTypeKey };
    //      kCVPixelFormatType_420YpCbCr8Planar is YUV420
    //      kCVPixelFormatType_420YpCbCr8BiPlanarFullRange is NV12
    uint32_t v = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
    const void *values[] = { CFNumberCreate(NULL, kCFNumberSInt32Type, &v) };
    attrs = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

    VTDecompressionOutputCallbackRecord callBackRecord;
    callBackRecord.decompressionOutputCallback = didDecompress;
    callBackRecord.decompressionOutputRefCon = NULL;
    if(VTDecompressionSessionCanAcceptFormatDescription(_deocderSession, _decoderFormatDescription))
    {
        NSLog(@"yes");
    }

    OSStatus status = VTDecompressionSessionCreate(kCFAllocatorSystemDefault,
                                          _decoderFormatDescription,
                                          NULL, attrs,
                                          &callBackRecord,
                                          &_deocderSession);
    CFRelease(attrs);
}

然后在遇到session失效时调用

if(decodeStatus == kVTInvalidSessionErr)
 {
                NSLog(@"IOS8VT: Invalid session, reset decoder session");
                [self resetH264Decoder];
            }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值