一、前言说明
之前整个视频拉流播放组件,已经实现了一个url地址带上各种参数,这样可以涵盖所有可能的应用场景,比如rtsp视频流指定tcp方式采集,本地摄像头指定分辨率帧率格式,桌面采集指定屏幕索引和区域,保存视频文件指定是否开启编码264或265,等等林林种种,说到这里还是很佩服自己的,通过这十几年的潜心研究,专注开发,无数客户的反馈,疯狂迭代和改进,才能考虑到这么的细致。
既然底层是已经支持了万能的url,那么提供一个万能的添加地址界面模块,越发强烈,势在必行,之前是让用户手动填写,尽管提供了非常细致详细的手册,但是还是无济于事,只有非常聪明的用户,才知道如何规范的填写,做软件开发就是这样,必须把用户往小白方面想,然后才能做出易用的软件,永远不要以为用户是你,知道如何操作使用,绝大部分的用户都是很懒的,才有了一键添加之类的傻瓜式操作。
1.1 特别提示
- 由于编解码涉及到很多参数,一般都按照默认参数进行处理。
- 部分用户有时候希望通过填入的播放地址就带上这些信息,比如通信协议、桌面采集的分辨率、编码保存是否转码、转码是否缩放原图等。
- 各种参数设置有个优先级,优先取地址中带的,没有带则取结构体中的,还没有则取默认值。
- 有些值会根据具体情况自动调整,比如本地设备采集没有硬解码,udp开头的视频流强制用udp协议,有些不支持硬解的格式自动将硬解码=none。
- 对于需要在地址中指定参数,对应占位符不填的需要占位符留空,不可以跳过。
- 占位符中填了对应参数的必须严格按照指定的格式要求,不按照则很可能导致解析失败。
- 参数用英文竖杠 | 隔开。
- 监控解码组件支持各种场景需求的格式,你能想到的情况都考虑到了,经过近十年的长期实战积累而成。强烈建议看完下面的格式要求。
1.2 通用字段
- encode开头的参数表示是编码用的,也就是保存文件,只有当开启录像存储的时候才会用到,如果要重新编码,系统设置那边视频参数编码下拉框要选择自动,默认可能是不编码。
- encodeVideoRatio表示视频压缩比率,对应bit_rate的值,在不改变分辨率的情况下,通过调整这个参数来控制保存文件体积的大小。如果值大于1,则表示关键帧间隔(也叫 I 帧间隔),比如50则关键帧间隔50,可以极大的提高压缩比并降低文件体积。默认保存视频用的间隔是原视频流的fps。目前不是很建议调整保存视频的关键帧间隔,可以小于fps,不建议大于fps,如果间隔超过了fps,这个可能会导致保存视频的时长不对。比如fps是25,关键帧间隔强制改成了50,则末尾可能会丢失1s。
- encodeVideoScale表示视频缩放值,1表示原始比例(默认值1),如果值float值,则相当于在原有分辨率按照这个值等比例缩放,比如encodeVideoScale=0.5,视频源分辨率是1920x720,则编码保存按照960x360这个分辨率保存。如果填的是640x480,则按照指定的这个分辨率强制缩放,可能会变形。这个在高分辨率的时候特别有用,比如采集的桌面分辨率很大,但是传输的时候受限于带宽,需要等比例压缩一下再传输,此时可以填0.5/0.2之类的值。
1.3 标准格式
- 格式要求: url|transport|decodeType|encodeVideo|encodeVideoFps|encodeVideoRatio|encodeVideoScale。
- url表示媒体地址,比如 f:/1.mp3 d:/1.mp4 rtsp://192.168.0.100 等。
- transport表示通信协议,可选 tcp/udp,一般用于rtsp视频流,很多时候在linux系统中必须指定tcp,rtsp摄像头才能正常采集。
- decodeType表示解码策略,0-速度优先,1-质量优先,2-均衡处理,3-最快速度(不做音视频同步,收到就立马解码和显示)。
- encodeVideo表示视频编码格式,0-不做处理,1-自动转码(源头是264就264/265就265),2-强制用264编码,3-强制用265编码。
- encodeVideoFps表示编码帧率,默认取源头流的帧率,如果指定了则取指定的。
- encodeVideoRatio见通用字段说明。
- encodeVideoScale见通用字段说明。
1.4 本地设备
- 格式要求:url|bufferSize|frameRate|codecName|encodeVideoRatio|encodeVideoScale。
- url表示媒体地址,采集摄像头统一约定 video=或者audio=开头。
- bufferSize表示分辨率,可填1280x720这种,不填默认640x480。
- frameRate表示帧率,不填默认25。
- codecName表示解码器名称,有些本地摄像头可以指定解码器名称比如mjpeg/h264/raw,前提是要该设备支持该解码器。默认为空则不指定会自动处理。
- encodeVideoRatio见通用字段说明。
- encodeVideoScale见通用字段说明。
- win系统如何查看设备名见本文档中 [打开本地摄像头](##13.7 打开本地摄像头)。
- linux系统查看设备名直接执行命令 ls /dev/video * 即可,一般对应的设备名是 /dev/video0。
- 下面假定本地摄像头的设备名为 USB Video Device。
- 写法1:video=USB Video Device,这种写法默认按照640x480分辨率打开摄像头。
- 写法2:video=USB Video Device|1280x720|30,这种写法按照指定的分辨率1280x720以及采集帧率30来打开摄像头。
- 写法3:video=/dev/video0,这种是对应linux系统,程序内部会自动过滤和调整填入的地址。
- 写法4:audio=麦克风 (USB Audio Device),只采集本地麦克风。
- 写法5:video=USB Video Device:audio=麦克风 (USB Audio Device),同时采集本地摄像头和麦克风。
- 写法6:video=USB Video Device|1920x1080|30|h264,按照1080P分辨率30帧h264格式解码来打开摄像头。
- 写法7:video=USB Video Device|1920x1080||||0.5,按照1080P分辨率采集,保存按照960x540分辨率。
- 约定audio=开头是只采集音频,video=开头可以采集视频或者视音频。
- 如果指定了分辨率和帧率则需要硬件支持才行,比如摄像头的最大分辨率是640x480,而指定了1280x720则会打开失败。
1.5 本地桌面
- 格式要求:url|bufferSize|frameRate|offsetX|offsetY|screenIndex|encodeVideoRatio|encodeVideoScale。
- url表示媒体地址,采集桌面统一约定 screen=开头。
- bufferSize表示采集分辨率,不填则默认取屏幕分辨率。
- frameRate表示采集帧率,基本上在2-30之间,不填的话默认ffmpeg会设定一个值,有时候是30。
- offsetX/offsetY表示偏移值XY坐标,从屏幕的左上角(0,0)开始。
- screenIndex表示屏幕索引,不填的话则默认取当前鼠标所在屏幕。在多个屏幕的时候可通过此参数指定屏幕索引。
- encodeVideoRatio见通用字段说明。
- encodeVideoScale见通用字段说明。
- 写法1:screen=desktop,当前屏幕全屏采集。
- 写法2:screen=desktop||15|0|0|1,屏幕2全屏采集,帧率15。
- 写法3:screen=desktop|800x600|10|50|100,鼠标所在当前屏幕采集,采集区域rect(50,100,800,600),帧率10。
- 写法4:screen=desktop|10x10,约定10x10分辨率表示所有屏幕合并到一个屏幕采集,比如两个屏幕的时候,当做一个屏幕整体采集。当合并屏幕采集的时候,XY偏移值参数无效。
- 写法5:screen=desktop|800x600|25|1500|300|255,约定屏幕索引255则取用户自定义的区域,该字符串表示采集区域是(1500, 300, 800, 600),自由区域,可以任意指定,比如两个屏幕中间区域。前提只要保证该区域在两个屏幕区域中,如果超过了的话可能采集失败,这要求用户需要对采集区域精准定位。
- 写法6:screen=title=MainWindow,对指定窗口标题是MainWindow的窗体采集。支持中文标题比如screen=title=系统设置。
- 写法7:screen=desktop|||||||0.5,对屏幕1采集,假设屏幕1分辨率1920x1080,末尾参数0.5则表示尺寸乘以该系数,最终按照960x540分辨率编码。
- 写法8:screen=desktop|||||||1280x900,对屏幕1采集,无论屏幕什么分辨率,强制转换成1280x900分辨率,如果不是等比例,可能会产生变形。
二、效果图
三、相关地址
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_push/bin_video_simulate。
四、功能特点
- 标准onvif协议,支持设备搜索、获取参数、快照抓图等。
- 支持264/265/aac等标准视音频协议传输。
- 支持多路批量onvif设备模拟,每一路都独立的端口。
- 支持本地摄像头采集转成onvif,可选择不同的设备、分辨率、帧率等参数。
- 支持本地桌面采集转成onvif,可选择不同的屏幕、分辨率、帧率等参数。
- 支持各种视频文件和视频流转成onvif,可重新设置编码转换以及分辨率转换。
- 支持4K、8K等高清分辨率,不限制分辨率,非264/265会自动转码推流。
- 每一路都可以设置统一或者独立的用户验证信息,为空则表示不验证。
- 可以把任意内容接入到NVR以及视频监控系统,方便保存录像文件,以便回放可查。
- 也可作为压力测试工具,比如模拟几千路onvif设备,让集成平台软件做接入压力测试。
- 推出去的流不仅有rtsp格式,还支持rtmp、http、flv、ws-flv、webrtc等方式访问,可以直接网页查看。
- 在管理工具上可以看到每一路的推流状况以及分辨率信息,非常直观。
- 支持自动重连拉流,重连推流,保证7乘以24小时稳定运行。
- 可设置开机自启动运行和后台运行,不显示在任务栏,作为后台服务运行。
- 可批量添加文件、添加目录,自动将目录下的所有文件添加到模拟器。
- 多功能添加地址面板,可以选择本地设备和监控设备,本地设备会自动识别摄像头设备和桌面设备,监控设备可以选择不同厂家,自动填充对应rtsp格式,填入用户信息即可,可以批量递增添加监控设备。
- 可无缝上传到市面上所有的onvif协议设备,包括海康、大华、宇视、华为、天地伟业等,也支持ONVIF Device Manager国际onvif工具。
- 支持gb28181设备模拟,具备设备注册、设备注销、设备心跳、设备信息、设备配置、设备状态应答等。
- 支持模拟报警和位置上报等,方便平台侧显示对应设备的实时位置。
- 支持一键添加批量模拟28181设备,实时显示已注册和已注销状态。
- 支持将本地桌面、本地摄像头、任意视频文件、视频流文件、手机摄像头等转换成28181设备,添加到NVR或者国标软件平台。
- sip协议同时支持udp和tcp两种通信方式,视频点播同时支持udp/tcp主动/tcp被动三种方式,涵盖所有可能的场景需求。
- 无论是onvif设备模拟组件还是28181设备模拟组件,全部原创底层协议解析,纯Qt实现,跨任意平台。
- 代码结构框架非常清晰,注释详细,代码精简不繁琐,非常易于学习和移植,可以很容易拓展其他接口需求。
- 支持Qt4/Qt5/Qt6以及后续所有版本、所有编译器、所有开发环境。
- 支持windows、linux、mac、国产OS、嵌入式linux、RK3588、树莓派、香橙派等系统。
五、相关代码