IOSurfaces - Artefakte in Videos, die keine Videooberflächen erfassen können

Dies ist eine zweiteilige Frage. Ich habe den folgenden Code, der die aktuelle Anzeigefläche erfasst und ein Video aus den Oberflächen erstellt (alles geschieht im Hintergrund).

for(int i=0;i<100;i++){
        IOMobileFramebufferConnection connect;
        kern_return_t result;
        IOSurfaceRef screenSurface = NULL;

        io_service_t framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleH1CLCD"));
        if(!framebufferService)
            framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleM2CLCD"));
        if(!framebufferService)
            framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleCLCD"));

        result = IOMobileFramebufferOpen(framebufferService, mach_task_self(), 0, &connect);

        result = IOMobileFramebufferGetLayerDefaultSurface(connect, 0, &screenSurface);

        uint32_t aseed;
        IOSurfaceLock(screenSurface, kIOSurfaceLockReadOnly, &aseed);
        uint32_t width = IOSurfaceGetWidth(screenSurface);
        uint32_t height = IOSurfaceGetHeight(screenSurface);
        m_width = width;
        m_height = height;
        CFMutableDictionaryRef dict;
        int pitch = width*4, size = width*height*4;
        int bPE=4;
        char pixelFormat[4] = {'A','R','G','B'};
        dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
        CFDictionarySetValue(dict, kIOSurfaceIsGlobal, kCFBooleanTrue);
        CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pitch));
        CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bPE));
        CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &width));
        CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &height));
        CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat));
        CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &size));

        IOSurfaceRef destSurf = IOSurfaceCreate(dict);

        IOSurfaceAcceleratorRef outAcc;
        IOSurfaceAcceleratorCreate(NULL, 0, &outAcc);

        IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, dict, NULL);

        IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed);
        CFRelease(outAcc);

        // MOST RELEVANT PART OF CODE

        CVPixelBufferCreateWithBytes(NULL, width, height, kCVPixelFormatType_32BGRA, IOSurfaceGetBaseAddress(destSurf), IOSurfaceGetBytesPerRow(destSurf), NULL, NULL, NULL, &sampleBuffer);

        CMTime frameTime = CMTimeMake(frameCount, (int32_t)5);

        [adaptor appendPixelBuffer:sampleBuffer withPresentationTime:frameTime];

        CFRelease(sampleBuffer);
        CFRelease(destSurf);
        frameCount++;
    }

PS: Die letzten 4-5 Codezeilen sind am relevantesten (wenn Sie filtern müssen).

1) Das produzierte Video enthält Artefakte. Ich habe bereits an Videos gearbeitet und bin auch schon auf ein solches Problem gestoßen. Ich nehme an, es kann zwei Gründe dafür geben:
ich. Der an den Adapter übergebene PixelBuffer wird geändert oder freigegeben, bevor die Verarbeitung (Codierung + Schreiben) abgeschlossen ist. Dies kann an asynchronen Aufrufen liegen. Ich bin mir aber nicht sicher, ob dies das Problem ist und wie es gelöst werden kann.
ii. Die übergebenen Zeitstempel sind ungenau (z. B. 2 Bilder mit demselben Zeitstempel oder ein Bild mit einem niedrigeren Zeitstempel als das vorherige Bild). Ich habe die Zeitstempelwerte abgemeldet und dies scheint nicht das Problem zu sein.

2) Der obige Code kann keine Oberflächen erfassen, wenn ein Video abgespielt wird oder wenn wir Spiele spielen. Alles was ich bekomme ist ein leerer Bildschirm in der Ausgabe. Dies kann an einer hardwarebeschleunigten Dekodierung liegen, die in solchen Fällen auftritt.

Alle Eingaben zu einem der beiden Teile der Fragen sind sehr hilfreich. Wenn Sie gute Links zum Lesen von IOSurfaces im Allgemeinen haben, posten Sie diese bitte hier.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage