随着国际竞争加剧,国产化自主可控将变成产品必备属性。G端客户和重点B端客户加速国产化采购升级,将带来新一轮国产化竞争格局的市场机会。今天介绍下我们自研的国产化播放器,期待合作。MetaX 国产播放器 支持国产操作系统(麒麟、统信等)、国产芯片、国产CPU等
通过GB28281、SIP等协议接入100+品牌的国产及非国产视频监控设备,包括华为、海康、大华、宇视科技等品牌的摄像头,以及道闸,门禁等周边产品,打破传统的配置方法,自研拖拽式配置工具:配置摄像头、NVR、SIP 国标服务,流媒体服务 MediaServer,存储服务器、推理服务器等,支持图像渲染和增强,AI视图分析,操作简单易用,且通过GB35114和国密算法加密。
1 视频播放
1.1 实时
指定窗口播放视频
在窗口布局中选择需要播放的窗口[1,4,9宫格皆可],左键单击,窗口边缘增加高亮颜色,单机浏览器中指定得GB28181已经注册上sip服务的视频,经过邀请播放后,则在窗口中开始播放改指定视频,其间根据设备得不同,相应的延时事件不同,如碰到设备无法被邀请,则在播放器中展示相应无法播放的错误信息。云台控制在窗口布局中选择需要转动云台的GB28181已经注册上sip服务器得视频设备,点击后弹出窗口云台信息,如果该设备有云台,则可以根据给定指令指挥[上下左右]转动云台。
历史视频
历史视频分为两种,一为摄像头历史视频,本身摄像头带存储卡,二为nvr硬盘录像。呼出流程为:
1 在窗口布局中指定某一个窗格
2 在已注册列表设备或者通道中指定某一路视频
3 指定开始事件和结束事件
4 点击播放
在设备无错误的情况下,播放窗格开始播放该历史时间段的视频。
1.2 视频录像
视频录像为播放实时流和历史流的过程中,可以随时开启录像,录像内容为ES流,支持h264和h265,视频录像为启动辅助线程取流,不在窗格中展示,不解码,直接存储ES裸流。
任务创建 删除 启动 停止 打开存放路径
任务创建:启动线程准备开始拉取流,开始创建文件,准备存储到磁盘中。任务的创建相当于线程的启动创建。
删除:停止并且删除该拉取任务,同时停止线程,消除所有线程占用资源,本身并不删除已经存储的文件。
启动:线程开始工作,读取流,解析,脱壳,将ES裸流存储到磁盘,每个文件都会包含相应的解码关键信息,以保证将来可以解码。
打开存放路径: 打开存放路径将会使用操作系统功能自有功能,从而打开资源管理器,到达配置的存储路径,同时显示和定位存储到磁盘中的文件。
1.3 编解码
视频容器中的压缩编码一般为h264,h265,播放器必须将码流解码为RGB或者YUV才能正确显示到窗格中,播放的过程中进行像素的窗口计算,使用放大或者缩小算法渲染。解码使用ffmpeg进行软硬件解码:
- 进行解码context的组装,分为h264或者h265
- 将接收的包组装成为packet(压缩包)
- 送packet到ffmpeg队列中,由ffmpeg判断是否可以解码
- 可以解码时,获取frame,该frame为yuv包,包含了yuv和高度宽度等
- 送入渲染队列
2 窗口布局
1 4 9宫格布局 窗口布局使用单窗口,4窗口,9宫格窗口进行界面展示。多窗口是为了满足监控视频路数较多的情况,顺序点击视频通道时,该视频将会在相应已经选择的窗口中显示。
设置布局
在工具挑中有单窗口,4窗口,9宫格窗口的三个按钮,一键可直接切换,无论在播放还是静止状态,都可以直接切换,在播放多路的过程中,由多路切换为更少路数播放时,已经播放的其他窗口被隐藏,切换回更多路(1->4 4->9 1->9)时隐藏取消。
3 辅助功能
3.1 单窗体/全部窗体 抓拍
对正在播放实时流或者历史流的某个窗体或者所有窗体进行图像的抓拍,同时存储到指定配置的磁盘目录中,文件根据时间命名,图像的存储压缩格式为通用jpg。
3.2 单窗体/全部窗体 录像
对正在播放实时流或者历史流的某个窗体或者所有窗体进行录像,同时存储到指定配置的磁盘目录中,文件根据时间命名,本身录像没有加容器壳为ES流。
3.3窗口最大化
将某一个窗口进行放大,放大到整体窗口中,作用域4和9宫格中的某一路流,指定某一路正在播放的流,单击放大按钮,该宫格窗口分辨高宽将会铺满播放区域,且为最上层窗口,其他窗口被掩盖到该窗口以下。
3.4 窗口关闭
点击关闭流按钮,关闭窗口中的实时流或者历史流播放,同时释放两个线程,释放队列已经存储的队列包。
3.5 全屏
将播放区域全屏化,使用窗口脱离原定父级窗口,使得播放区域窗体的父级窗体为桌面窗体,在多显示器的情况下,同时判定是属于多显示桌面中的一个显示编号,全屏到该显示器编号下的桌面区域中。
3.6 设备名称展示
设备名称为所有设备展示和设备通道展示,设备必须注册到sip服务中,由sip服务通知浏览器,浏览器获取内容后展示设备或者通道的名称,如果已经定义设备名称,则显示设备的名称,如果无,则显示通道号码。
3.7 启动/停止录像
工具栏中点击启动或者停止,可以启动或者停止该路流的录像功能,开始时启动线程,停止时释放线程。
3.8 一键实时转历史 历史转实时
工具栏中可以在播放实时流的情况下,点击回放,则停止实时流,开始显示回放子窗体,选择回放开始和结束时间,可以播放历史视频,在历史视频中,点击实时,则切换回实时播放。
技术方法和路线:
播放器嵌入:
整个播放器为客户端程序,嵌入到浏览器中,使用父级窗口变化的技术将播放器的父级窗口改变成浏览器,同时在浏览器变化的过程中,和播放器进行通信,从而使得播放器掌握浏览器的内部容器大小,从而适应和改变播放器的大小。
软解码:解码过程为双线程:线程A为读取流线程 线程B为解码线程,线程通信通过队列进行,同时为了保证安全,使用互斥锁锁定队列资源,保证AB线程不会同时增加和删除队列内容,以下为过程:
1 读取流,同时解析,脱去容器壳
2 分析为h264或者h265
3 将ES 流存储到队列中
4 根据码流信息,使用不同的(264解码环境,265解码环境)使用cpu指令解码,265解码会消耗较多的cpu时间。
硬解码:使用qsv(intel)和cuda(nvidia)指令解码,硬解码过程使用GPU多核心计算算力,释放cpu,过程中会有cpu和gpu之间的数据拷贝,会带来一定的cpu消耗,总体来说,比单独使用cpu要更加高效,同时,硬解在多路播放的过程中的效率会提升。
问题:硬件解码带来GPU能耗增加,过多的路数会使得GPU发热急剧增加,可以综合使用软解和硬件解码。
纹理贴图: 纹理(Texturing)是一种针对物体表面属性进行“建模”的高效技术。图像纹理中的像素通常被称为纹素(Texels),区别于屏幕上的像素。通过将投影方程(projector function)运用于空间中的点 ,从而得到一组称为参数空间值(parameter-spacevalues)的关于纹理的数值,再使用一个或者多个映射函数(corresponder function)将参数空间值(parameter-space values )转换到纹理空间。这个过程就为贴图(Mapping,也称映射 ),也就是纹理贴图(Texture Mapping,也称纹理映射 )。
投影函数: 投影函数(projector function)的功能就是将空间中的三维点转化为纹理坐标,也就是获取表面的位置并将其投影到参数空间中。过程是经投影结果的像素存储在模型顶点数据中。
各种常见投影的不同要点:
球形投影(The spherical projection)。球形投影将点投射到一个中心位于某个点的虚拟球体上。
圆柱投影(Cylindrical projection)。与球体投影一样,圆柱投影计算的是纹理坐标u,而计算得到的另一个纹理坐标v是沿该圆柱轴线的距离。这种投影方法对具有自然轴的物体比较适用,比如旋转表面,如果表面与圆柱体轴线接近垂直时,就会出现变形。
平面投影(The planar projection)。平面投影非常类似于x-射线幻灯片投影,它沿着一个方向进行投影,并将纹理应用到物体的所有表面上。这种方法通常使用正交投影。播放器使用正交平面投影。
渲染方法:使用d3d和opengl 技术进行渲染。放大和缩小使用相应的均值算法和线性插值算法。将h264或者h265图像转化成为RGB后,由显卡作为d3d或者opengl的纹理进行线性插值,显示到窗口中。