EasyPlayer RTSP Windows播放器OSD字幕叠加接口方法和使用效果全解析
2017-12-13 17:31
696 查看
EasyPlayer RTSP Windows播放器新增OSD字幕叠加接口方法,这个接口和码率信息显示接口方法类似,都是调用FFRender库的接口实现的多OSD叠加,下面讲解下该方法的调用和注意事项;
OSD叠加方法声明如下:
其中,channelId: 播放器通道ID,标识当前的播放器实例;
show:标识是否显示OSD叠加,0=不现实 1=显示
osd:显示信息填充结构,定义如下:
注意:osd字幕叠加通过”\r\n“结束符进行换行,一行的长度不能超过128个字节,总的OSD叠加不能超过1024个字节。其中OSD大小设置只有D3D渲染模式才能生效;
我们已经对OSD叠加的接口有所了解,下面我们来写一段调用代码来看看效果:
如上代码段所示,主要对OSD_PLAYER_OSD结构的参数进行设置,就能得到我们想要的效果,如下图所示:
(1)GDI显示
(2)D3D显示
对比两种方式的OSD叠加还是有所区别的,D3D的因为有硬件加速,我们可以看到OSD叠加更加清晰而且效率也高,OSD则是相对粗糙,而且在原FFRender库中GDI接口是不支持换行的,所以,我们需要做一些技术处理,如下段代码所示:
简单描述下上段代码,即:通过查找“\r\n”结束符作为一条OSD信息,而一条OSD又不能超过128个字节进行换行,换行行高则通过size来确定,因为GDI不支持size大小的设定,所以我们给了个固定值40,当然为了紧凑点或者行间距大点还可以调整。
此外,目前版本的EasyPalyer RTSP Windows播放器只支持软解码的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播放器只支持软解码的OSD叠加显示,硬解码目前还不支持。
相关文章推荐
- EasyPlayer windows RTSP播放器OCX插件使用说明
- EasyPlayer windows RTSP播放器OCX插件使用说明
- EasyPlayerPro windows播放器之多窗口播放音量控制方法
- EasyPlayerPro Windows播放器本地快照抓拍截图功能实现方法
- EasyPlayerPro windows播放器本地配置文件配置方法介绍
- libEasyPlayer RTSP windows播放器SDK API接口设计说明
- EasyPlayerPro windows播放器本地配置文件配置方法介绍
- EasyPlayerPro windows播放器之多窗口播放音量控制方法
- EasyPlayerPro Windows播放器本地快照抓拍截图功能实现方法
- qt使用libvlc库的方法,RTSP播放器的实现(windows、Linux)
- libEasyPlayer RTSP windows播放器SDK API接口设计说明
- 播放视频android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法
- POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)
- EasyPlayer RTSP/RTMP/HTTP/HLS全功能播放器
- android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法
- iOS9获取所在城市的接口及解析(简单的NSURLSession使用和新的编码方法使用)
- C#中Windows Media Player控件使用实例|方法
- VS2010 基于windows media player做音乐播放器,问题解析(已验证)
- android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法
- 解析windows下使用命令的方式安装mysql5.7的方法