## 一、前言说明
之前整个视频拉流播放组件,已经实现了一个url地址带上各种参数,这样可以涵盖所有可能的应用场景,比如rtsp视频流指定tcp方式采集,本地摄像头指定分辨率帧率格式,桌面采集指定屏幕索引和区域,保存视频文件指定是否开启编码264或265,等等林林种种,说到这里还是很佩服自己的,通过这十几年的潜心研究,专注开发,无数客户的反馈,疯狂迭代和改进,才能考虑到这么的细致。
既然底层是已经支持了万能的url,那么提供一个万能的添加地址界面模块,越发强烈,势在必行,之前是让用户手动填写,尽管提供了非常细致详细的手册,但是还是无济于事,只有非常聪明的用户,才知道如何规范的填写,做软件开发就是这样,必须把用户往小白方面想,然后才能做出易用的软件,永远不要以为用户是你,知道如何操作使用,绝大部分的用户都是很懒的,才有了一键添加之类的傻瓜式操作。
### 1.1 特别提示
1. 由于编解码涉及到很多参数,一般都按照默认参数进行处理。
2. 部分用户有时候希望通过填入的播放地址就带上这些信息,比如通信协议、桌面采集的分辨率、编码保存是否转码、转码是否缩放原图等。
3. 各种参数设置有个优先级,优先取地址中带的,没有带则取结构体中的,还没有则取默认值。
4. 有些值会根据具体情况自动调整,比如本地设备采集没有硬解码,udp开头的视频流强制用udp协议,有些不支持硬解的格式自动将硬解码=none。
5. 对于需要在地址中指定参数,对应占位符不填的需要占位符留空,不可以跳过。
6. 占位符中填了对应参数的必须严格按照指定的格式要求,不按照则很可能导致解析失败。
7. 参数用英文竖杠 | 隔开。
8. **监控解码组件支持各种场景需求的格式,你能想到的情况都考虑到了,经过近十年的长期实战积累而成。强烈建议看完下面的格式要求。**
### 1.2 通用字段
1. **encode开头的参数表示是编码用的,也就是保存文件,只有当开启录像存储的时候才会用到,如果要重新编码,系统设置那边视频参数编码下拉框要选择自动,默认可能是不编码。**
2. encodeVideoRatio表示视频压缩比率,对应bit_rate的值,在不改变分辨率的情况下,通过调整这个参数来控制保存文件体积的大小。**如果值大于1,则表示关键帧间隔(也叫 I 帧间隔),比如50则关键帧间隔50,可以极大的提高压缩比并降低文件体积。默认保存视频用的间隔是原视频流的fps。目前不是很建议调整保存视频的关键帧间隔,可以小于fps,不建议大于fps,如果间隔超过了fps,这个可能会导致保存视频的时长不对。比如fps是25,关键帧间隔强制改成了50,则末尾可能会丢失1s。**
3. encodeVideoScale表示视频缩放值,1表示原始比例(默认值1),如果值float值,则相当于在原有分辨率按照这个值等比例缩放,比如encodeVideoScale=0.5,视频源分辨率是1920x720,则编码保存按照960x360这个分辨率保存。如果填的是640x480,则按照指定的这个分辨率强制缩放,可能会变形。这个在高分辨率的时候特别有用,比如采集的桌面分辨率很大,但是传输的时候受限于带宽,需要等比例压缩一下再传输,此时可以填0.5/0.2之类的值。
### 1.3 标准格式
1. **格式要求: url|transport|decodeType|encodeVideo|encodeVideoFps|encodeVideoRatio|encodeVideoScale。**
2. url表示媒体地址,比如 f:/1.mp3 d:/1.mp4 rtsp://192.168.0.100 等。
3. transport表示通信协议,可选 tcp/udp,一般用于rtsp视频流,很多时候在linux系统中必须指定tcp,rtsp摄像头才能正常采集。
4. decodeType表示解码策略,0-速度优先,1-质量优先,2-均衡处理,3-最快速度(不做音视频同步,收到就立马解码和显示)。
5. encodeVideo表示视频编码格式,0-不做处理,1-自动转码(源头是264就264/265就265),2-强制用264编码,3-强制用265编码。
6. encodeVideoFps表示编码帧率,默认取源头流的帧率,如果指定了则取指定的。
7. encodeVideoRatio见通用字段说明。
8. encodeVideoScale见通用字段说明。
### 1.4 本地设备
1. **格式要求:url|bufferSize|frameRate|codecName|encodeVideoRatio|encodeVideoScale。**
2. url表示媒体地址,采集摄像头统一约定 video=或者audio=开头。
3. bufferSize表示分辨率,可填1280x720这种,不填默认640x480。
4. frameRate表示帧率,不填默认25。
5. codecName表示解码器名称,有些本地摄像头可以指定解码器名称比如mjpeg/h264/raw,前提是要该设备支持该解码器。默认为空则不指定会自动处理。
6. encodeVideoRatio见通用字段说明。
7. encodeVideoScale见通用字段说明。
8. win系统如何查看设备名见本文档中 [打开本地摄像头](##13.7 打开本地摄像头)。
9. linux系统查看设备名直接执行命令 ls /dev/video *即可,一般对应的设备名是 /dev/video0。
10. 下面假定本地摄像头的设备名为 USB Vid