replaykit - 使用 iOS replaykit 广播上传扩展时的图像残留问题
问题描述
我正在使用 iPad6 在 iOS11.4.1 或 12.0 下测试广播上传扩展。从 CMSampleBufferRef 提取 YUV 数据并将这些数据保存到文件后,我得到了一些坏图像。问题似乎是最后一帧图像仍然保留在新帧上,并且没有刷新。从回调中出来时,可能数据还没有准备好。我想知道如何避免这个问题。 这里有一张糟糕的图片
- (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;
}
}
解决方案
推荐阅读
- php - Laravel黄昏,测试结果不正确
- c# - 无法在 2017 服务器中加载文件或程序集 Microsoft.SqlServer.management.sdk.sfc 版本 11.0.0.0
- node.js - mongoose createConnection 未启动且没有错误
- ansible - become_user 自动检测 ansible
- matlab - 使用matlab在奇点容器中的分段违规
- lambda - 在 Java8 中使用 Lambda 表达式对地图进行排序
- jenkins - 将 contains 与 Jenkins 表达式和 env var 一起使用
- bash - find 不会下降到某些目录
- javascript - Chrome 扩展程序创建选项卡并向其发送消息
- java - java - 如何使用计数子方法和Java中的目标字符串计算添加到列表数组的字符串?