目前我制作了一段视频 经过OSD可以叠加一个logo图片在视频上,现在我想将一张同样分辨率大小的图片插入视频当作背景图片 ,和之前不一样的是,之前是将图片叠加到视频帧上,现在想将视频帧叠加在这张图片上 怎么实现,贴上添加logo图片到视频帧上的部分代码 ,求大神指点后者改如何实现,谢谢了!
osdBufSize[i] = pdynamicFont->nLengthfontY;//获取到要插入图片的大小
status = Vsys_allocBuf(1, osdBufSize[i], bufAlign, &bufInfo[i]);
if(status == -1)
{
printf("ERR :%s|%d| Vsys_allocBuf failed!!! \n",__func__,__LINE__);
}
chWinPrm->winPrm[i].addr[0][0] = (bufInfo[i].physAddr);//这里的三个地址关系不是很明白
curVirtAddr = bufInfo[i].virtAddr;
if(curVirtAddr != NULL && pdynamicFont->fontY != NULL && chWinPrm->winPrm[i].addr[0][0] != NULL)
{
memcpy(curVirtAddr, pdynamicFont->fontY, pdynamicFont->nLengthfontY);将获取到的要插入的图片YUV数据写道上面的地址就实现在视频上添加logo
//memcpy(pdynamicFont->fontY, curVirtAddr, pdynamicFont->nLengthfontY);
}
如何反过来 将视频帧加到要插入的图片上面,实现以插入的图片作为背景层的效果 ,求指导!!
Chris Meng:
Zhou Jarman,
你看看我下面的理解是否正确?
假设你要编码的大小是1920×1080,你有一张背景图片也是1920×1080,你的视频图像是1280×720,你想把视频图像放到背景图像的上面(中间),然后编码?
如果我的理解正确,而你又不需要做透明度,我建议你把预先准备好几个有背景框的buffer,把采集的图像输出到这些buffer里面,然后拿这个buffer去编码。
user4865572:
回复 Chris Meng:
Chris Meng
你好!
情况是这样的,我现在有一张1920×1080的背景图片,我想将采集的的视频数据放在这个背景图片上。我想仿照OSD的功能去实现,相当于反向操作,将视频数据叠加在背景图片之上,之前我做的是加logo是将图片叠加在视频上的。视频数据是经过SWMSLink处理成了1920×1080的大小,然后在将数据送到OSD处理的,我想在OSD这里去实现 ,之后我会将对视频帧进行抠像处理。 请问 我这样去实现是否可行?
Chris Meng:
回复 user4865572:
Zhou Jarman,
理论上是可以。还是我之前的问题,你需要做透明度么?如果需要,而且用于osd的图像特别大,swosd的计算量就会很大了,你需要测试一下性能是否能满足。
如果不透明的话,背景的位置是固定的只要把相应的图像使用EDMA/SC输出到相应的位置就可以了。
user4865572:
回复 Chris Meng:
Chris Meng
你好!
我现在不需要做透明度,目前我只想实现将视频插入背景图片的数据,不知道怎么去做,还是我上面的代码,应该怎么去改,因为我不是很明白那几个地址的含义,能指点一下吗?谢谢了