SkeyePlayer RTSP Windows播放器OSD字幕叠加接口方法和使用效果全解析

2023-04-19 15:29:57 浏览数 (2)

SkeyePlayer RTSP Windows播放器新增OSD字幕叠加接口方法,这个接口和码率信息显示接口方法类似,都是调用FFRender库的接口实现的多OSD叠加,下面讲解下该方法的调用和注意事项;

OSD叠加方法声明如下:

代码语言:txt复制
LIB_SkeyePLAYER_API int SkeyePlayer_ShowOSD(int channelId, int show, Skeye_PALYER_OSD osd);

其中,channelId: 播放器通道ID,标识当前的播放器实例;

show:标识是否显示OSD叠加,0=不现实 1=显示

osd:显示信息填充结构,定义如下:

代码语言:txt复制
typedef struct tagSkeye_PALYER_OSD 
{ 
char stOSD[1024]; //OSD字幕信息 
DWORD alpha; //透明通到0-255 0=透明 255=完全不透明
DWORD color; //RGB(0xf9,0xf9,0xf9) 
DWORD shadowcolor; //OSD背景颜色RGB(0x4d,0x4d,0x4d) 全为0背景透明 
RECT rect; //OSD基于图像右上角显示区域 
int size; //OSD字体的大小 
}Skeye_PALYER_OSD; 

注意:osd字幕叠加通过”rn“结束符进行换行,一行的长度不能超过128个字节,总的OSD叠加不能超过1024个字节。其中OSD大小设置只有D3D渲染模式才能生效;

我们已经对OSD叠加的接口有所了解,下面我们来写一段调用代码来看看效果:

代码语言:txt复制
			//OSD Example
			Skeye_PALYER_OSD osd;
			osd.alpha = 255;
			osd.size = 35;
			osd.color = RGB(255,0,255);
			osd.rect.left = 10;
			osd.rect.right = 5000;
			osd.rect.top = 100;
			osd.rect.bottom = 800;
			osd.shadowcolor = RGB(0,0,0);
			char* ss =  "这是SkeyePlayer-RTSP-Win播放器 rn的字幕叠加接口的效果!!!rn以"\r\n"为换行结束符号rn注意:每行的长度不能超过128个字节rn总的OSD长度不能超过1024个字节";
			strcpy(osd.stOSD ,ss);
			SkeyePlayer_ShowOSD(m_ChannelId, 1,  osd);

如上代码段所示,主要对OSD_PLAYER_OSD结构的参数进行设置,就能得到我们想要的效果,如下图所示:

(1)GDI显示

外链图片转存中...(img-6MyHsd96-1652407820539)

(2)D3D显示

外链图片转存中...(img-3J1hL1gx-1652407820541)

对比两种方式的OSD叠加还是有所区别的,D3D的因为有硬件加速,我们可以看到OSD叠加更加清晰而且效率也高,OSD则是相对粗糙,而且在原FFRender库中GDI接口是不支持换行的,所以,我们需要做一些技术处理,如下段代码所示:

代码语言:txt复制
			std::string sOSD = pThread->osd.stOSD;
			while (!sOSD.empty())
			{
				char* subOSD = (char*)sOSD.c_str();
				int nOSDLen = sOSD.length();
				int sublen = 0;

				int nEofPos = sOSD.find("rn");

				if (nEofPos>127)
				{
					subOSD[128] = 0;
					sublen = 128;
				}
				if (pThread->renderFormat == GDI_FORMAT_RGB24)
				{
					CopyRect(&osd[osdLines].rect, &pThread->osd.rect);
					osd[osdLines].rect.top = pThread->osd.rect.top 40*osdLines;
					osd[osdLines].rect.bottom = pThread->osd.rect.bottom 40*osdLines;
					if (nEofPos>=0)
					{
						subOSD[nEofPos] = 0;
						sublen = nEofPos;
					}
				}
				else
				{
					CopyRect(&osd[osdLines].rect, &pThread->osd.rect);
					osd[osdLines].rect.top = pThread->osd.rect.top pThread->osd.size*osdLines;
					osd[osdLines].rect.bottom = pThread->osd.rect.bottom pThread->osd.size*osdLines;
					if (nEofPos>=0)
					{
						subOSD[nEofPos] = 0;
						sublen = nEofPos;
					}
				}	

				MByteToWChar(subOSD, osd[osdLines].string, sizeof(osd[osdLines].string)/sizeof(osd[osdLines].string[0]));

				osd[osdLines].color = pThread->osd.color;
				osd[osdLines].shadowcolor = pThread->osd.shadowcolor;
				osd[osdLines].alpha = pThread->osd.alpha;
				osdLines  ;
				if (nEofPos>=0)
				{
					sOSD = subOSD nEofPos 2;
				}
				else
				{
					sOSD = "";
				}
			}

简单描述下上段代码,即:通过查找“rn”结束符作为一条OSD信息,而一条OSD又不能超过128个字节进行换行,换行行高则通过size来确定,因为GDI不支持size大小的设定,所以我们给了个固定值40,当然为了紧凑点或者行间距大点还可以调整。

此外,目前版本的SkeyePalyer RTSP Windows播放器只支持软解码的OSD叠加显示,硬解码目前还不支持。

0 人点赞