0
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 を返します。誰でも助けることができますか?

4

1 に答える 1

1

decompressionSession 作成のコードを見ないと、なんとも言えません。decompressionSession が、作成時に提供されたコールバック関数に outputBuffer を提供している可能性があるため、コードのその部分も追加することを強くお勧めします。

&outputPixelBuffer を提供することにより:

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

参照を提供したことを意味するだけであり、確実に同期的に満たされることを意味するものではありません。

また、次の OSStatus を出力することをお勧めします。

CMBlockBufferCreateWithMemoryBlock

CMSampleBufferCreateReady

これらのステップに問題がある場合は、それを知る方法があるはずです。

于 2020-05-09T01:51:43.950 に答える