Я тестирую расширение широковещательной загрузки под 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;
}
}