iOS 13.1.3 VTDecompressionSessionDecodeFrame无法正确解码

时间:2019-10-28 10:51:02

标签: ios decode video-toolbox

CVPixelBufferRef outputPixelBuffer = NULL;

CMBlockBufferRef blockBuffer = NULL;
void* buffer = (void*)[videoUnit bufferWithH265LengthHeader];
OSStatus status  = CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault,
                                                      buffer,
                                                      videoUnit.length,
                                                      kCFAllocatorNull,
                                                      NULL, 0, videoUnit.length,
                                                      0, &blockBuffer);
if(status == kCMBlockBufferNoErr) {
    CMSampleBufferRef sampleBuffer = NULL;
    const size_t sampleSizeArray[] = {videoUnit.length};
    status = CMSampleBufferCreateReady(kCFAllocatorDefault,
                                       blockBuffer,
                                       _decoderFormatDescription ,
                                       1, 0, NULL, 1, sampleSizeArray,
                                       &sampleBuffer);
    if (status == kCMBlockBufferNoErr && sampleBuffer && _deocderSession) {
        VTDecodeFrameFlags flags = 0;
        VTDecodeInfoFlags flagOut = 0;
        OSStatus decodeStatus = VTDecompressionSessionDecodeFrame(_deocderSession,
                                                                  sampleBuffer,
                                                                  flags,
                                                                  &outputPixelBuffer,
                                                                  &flagOut);

        if(decodeStatus == kVTInvalidSessionErr) {
            NSLog(@"IOS8VT: Invalid session, reset decoder session");
        } else if(decodeStatus == kVTVideoDecoderBadDataErr) {
            NSLog(@"IOS8VT: decode failed status=%d(Bad data)", decodeStatus);
        } else if(decodeStatus != noErr) {
            NSLog(@"IOS8VT: decode failed status=%d", decodeStatus);
        }

        CFRelease(sampleBuffer);
    }
    CFRelease(blockBuffer);
}

return outputPixelBuffer;

这是我的代码,用于解码流数据。在iPhone 6s上运行良好,但是当代码在iPhoneX或iphone11上运行时,“ outputPixelBuffer”返回nil。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

在没有看到用于decompressionSession创建的代码的情况下,很难说。可能是您的decompressionSession正在为创建时提供的回调函数提供outputBuffer,因此我强烈建议您也将代码的这一部分添加进来。

通过在以下位置提供&outputPixelBuffer:

OSStatus decodeStatus = VTDecompressionSessionDecodeFrame(_deocderSession,
                                                                  sampleBuffer,
                                                                  flags,
                                                                  &outputPixelBuffer,
                                                                  &flagOut);

仅表示您已提供参考,并不意味着一定会对其进行同步填充。

我还建议您为以下内容打印OSStatus:

CMBlockBufferCreateWithMemoryBlock

CMSampleBufferCreateReady

如果这些步骤有问题,应该有一种方法知道。