RTSP播放器網頁web無插件直播流媒體音視頻播放器EasyPlayer-RTSP實現視頻渲染OSD疊加效果操作方法


EasyPlayer-RTSP播放器是一套RTSP專用的播放器,包括有:Windows(支持IE插件,npapi插件)、Android、iOS三個平台,區別於市面上大部分的通用播放器,EasyPlayer-RTSP更加精煉、更加專注,具備非常低的延時,非常高RTSP協議兼容性,編碼數據解析等方面,都有非常大的優勢。

EasyPlayer RTSP Windows播放器新增OSD字幕疊加接口方法,這個接口和碼率信息顯示接口方法類似,都是調用FFRender庫的接口實現的多OSD疊加。

多OSD疊加調用和注意事項

OSD疊加方法聲明如下:

LIB_EASYPLAYER_API int EasyPlayer_ShowOSD(int channelId, int show, EASY_PALYER_OSD osd);

其中:
channelId: 播放器通道ID,標識當前的播放器實例;
show:標識是否顯示OSD疊加,0=不現實 1=顯示;
osd:顯示信息填充結構,定義如下:

typedef struct tagEASY_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字體的大小 
}EASY_PALYER_OSD; 

注意:osd字幕疊加通過”\r\n“結束符進行換行,一行的長度不能超過128個字節,總的OSD疊加不能超過1024個字節。其中OSD大小設置只有D3D渲染模式才能生效;
我們已經對OSD疊加的接口有所了解,下面我們來寫一段調用代碼來看看效果:

		//OSD Example
		EASY_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 =  "這是EasyPlayer-RTSP-Win播放器 \r\n的字幕疊加接口的效果!!!\r\n以\"\\r\\n\"為換行結束符號\r\n注意:每行的長度不能超過128個字節\r\n總的OSD長度不能超過1024個字節";
		strcpy(osd.stOSD ,ss);
		EasyPlayer_ShowOSD(m_ChannelId, 1,  osd);

如上代碼段所示,主要對OSD_PLAYER_OSD結構的參數進行設置,就能得到我們想要的效果,如下圖所示:
(1)GDI顯示

(2)D3D顯示

對比兩種方式的OSD疊加還是有所區別的,D3D的因為有硬件加速,我們可以看到OSD疊加更加清晰而且效率也高,OSD則是相對粗糙,而且在原FFRender庫中GDI接口是不支持換行的,所以,我們需要做一些技術處理,如下段代碼所示:

			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("\r\n");

				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 = "";
				}
			}

簡單描述下上段代碼,即:通過查找“\r\n”結束符作為一條OSD信息,而一條OSD又不能超過128個字節進行換行,換行行高則通過size來確定,因為GDI不支持size大小的設定,所以我們給了個固定值40,當然為了緊湊點或者行間距大點還可以調整。

此外,目前版本的EasyPalyer RTSP Windows播放器只支持軟解碼和Nvidia硬解碼的OSD疊加顯示,Intel硬解碼目前還不支持。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM