Изображение прилипает Проблема при использовании iOS replaykit Broadcast Upload Extension - PullRequest
0 голосов
/ 03 сентября 2018

Я тестирую расширение широковещательной загрузки под iOS11.4.1 или 12.0 с iPad6. После извлечения данных YUV из CMSampleBufferRef и сохранения этих данных в файл я получаю несколько плохих изображений. Кажется, проблема в том, что изображение последнего кадра все еще остается в новом кадре и не обновляется. Может быть, данные не готовы, когда выходят из обратного вызова. Я задаюсь вопросом, как избежать этой проблемы. одно плохое изображение здесь

еще один плохой образ

- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {  
    switch (sampleBufferType) {  
    case RPSampleBufferTypeVideo:  
    {  
        CFRetain(sampleBuffer);  

        size_t bytes = 0;  
        char* data = NULL;  
        size_t bufwidth, bufheight, bufstride;  
        CVPixelBufferRef pixelbuf = CMSampleBufferGetImageBuffer(sampleBuffer);  
        CVReturn cr = CVPixelBufferLockBaseAddress(pixelbuf, kCVPixelBufferLock_ReadOnly);  

        for (size_t i = 0; i < CVPixelBufferGetPlaneCount(pixelbuf); i++)  
        {  
            bufwidth = CVPixelBufferGetWidthOfPlane(pixelbuf, i);  
            bufheight = CVPixelBufferGetHeightOfPlane(pixelbuf, i);  
            bufstride = CVPixelBufferGetBytesPerRowOfPlane(pixelbuf,i);  

            data = (char*)CVPixelBufferGetBaseAddressOfPlane(pixelbuf,i);  

            if(bufwidth == bufstride)  
            {  
                size_t ylen = bufwidth*bufheight;  
                fwrite(data, ylen, 1, _file_yuv);  
            }  
            else  
            {  
                size_t factor = bufstride/bufwidth;  
                bytes = bufwidth * factor;  
                for (j = 0; j < bufheight; j++)  
                {  
                    fwrite(data, bytes, 1, _file_yuv);  
                    data += bufstride;  
                }  
            }  
        }  
        CVPixelBufferUnlockBaseAddress(pixelbuf, kCVPixelBufferLock_ReadOnly);  
        CFRelease(sampleBuffer);  

    }  
        break;  
    case RPSampleBufferTypeAudioApp:  
        break;  

    default:  
        break;  
}  

}

...