本文将就接入 TRTC 中常碰到与视频相关的问题进行分析和探讨, 由于小编水平有限, 如有误的地方, 欢迎读者评论指正.
随着移动互联网普及, 移动设备和高清摄像头在日常生活和工作中大量使用, 人们产生海量的视频数据, 如何高效实时采集, 传输, 显示视频数据, 成为当下各方参与者摩拳擦掌的竞技舞台, TRTC 是将腾讯多年来在网络与音视频技术上的深度积累, 以多人音视频通话和低延时互动直播两大场景化方案, TRTC 音视频解决方案是其中的佼佼者.
TRTC 上手系列文章
TRTC 零基础上手之视频入门篇
TRTC 零基础上手之视频异常篇
视频基本属性
码率
码率又称比特率 (bit rate) 单位是 bps, 指的是单位时间内的数据量, 比如, 1kbps 就是等于一秒内传输 1024byte 的数据. 在视频压缩算法不变情况下, 码率的大小决定了视频画面最终显示的质量. 高码率一定比低码率的画面看起来要清晰和细腻, 但可能会因为用户带宽不足导致卡顿, 所以开发者需要根据场景分辨率等因素选择一个适合码率.
分辨率
分辨率 (resolution) 有时候又叫清晰度, 解析度, 是指画面的尺寸大小, 通常使用横向像素 X 纵向像素, 这样的形式表示. 比如: 640 x 480,1280 x 720 等. TRTC 当前最高分辨率支持到 2K.
帧率
帧是指每个静止画面, 视频中每秒内显示的帧数量叫做帧率(frame rate), 单位是 fps(frame per second). 一般视频的帧率在 15fps, 画面的流畅度满足需要, 对流畅度较高的场合可以设置 24fps 以上的帧率流程度, 比如电影.
关于视频的新手常见误区
1. 分辨率越高越好?
较高的分辨率也需要较高的码率来支撑, 如果分辨率选择 1280 x 720, 但码率却指定为 200kbps, 画面就会有大量的马赛克. 推荐参考 分辨率码率参照表 进行设置.
2. 帧率越高越好?
由于摄像头采集的画面是曝光阶段中所有现实物体的完整映射, 所以并不是帧率越高, 感官就越流畅, 这一点跟游戏里的 FPS 是不一样的. 恰恰相反, 帧率过高, 会拉低每帧画面的画质, 也会减少摄像机的曝光时间, 效果可能会更差.
3. 码率越高越好?
较高的码率也需要较高的分辨率来匹配, 对于 320 x 240 这样分辨率, 1000kbps 的码率就很浪费了, 推荐参考 分辨率码率参照表 进行设置.
4. 用 Wi-Fi 可以设置很高的分辨率和码率?
并不是说 Wi-Fi 的网速是恒定不变的, 如果离无线路由器较远, 或者路由器信道被占用, 可能网速还不如 4G.
针对这种情况, TRTC SDK 提供了测速功能, 可以在视频通话前先进行测速, 根据打分值来确定网络好坏.
5. 在频繁关闭和打开视频场景, 拉流画面会闪?
打开摄像头和关闭摄像头因为涉及一系列的硬件操作可能会有延时等情况, 建议在这种场景使用暂停 / 恢复视频 (muteLocalVideo) 接口, 使用该接口可以使得拉流画面快速的停止和恢复, 效率更高, 同时可以使用 (setVideoMuteImage) 设置暂停时推静止画面, 从而获得更佳的用户体验.
6. 推荐一个视频画面既清晰又流畅还要省钱的方案?
可以根据场景选择, 比如教育白板需要全高清分辨率但对帧率要求不高, 码率设置大点同时开启大小画面, 适应低带宽的用户, 又比如直播场景对分辨率要求适中, 设置码率和最小码率的区间大一点可以保证大多数用户观看流畅性. 视频会议场景分辨率可以设小一点, 满足头像画面即可, 同时小画面可以很好地适应用户同时进行多路拉流的带宽需求. 所以, 既省钱又好的方案是需要跟应用场景相适配的.
TRTC 视频能力拓展
在开发过程中, 常常会遇到一些特殊的需求, 这些需求中有的可能会超越一般的功能, 正式 TRTC 有强大视频能力同时扩展能力非常丰富, 开发者了解这些可以轻松搞定一些特殊的需求.
1. 视频画面为什么是镜像?
使用前摄像头进行视频通话, 会有镜像效果, 所以本地预览和远端观众画面是左右颠倒. 若您想让两端画面一致可以参考以下方案:
方案一: 改变本地预览画面
改变本地预览接口是通过接口 setLocalViewMirror(mirrorType) 来改变本地预览画面镜像方式. 如果开发者只想让前摄像头保持镜像, mirrorType 的值建议设置为 ATUO.
trtcCloud.setLocalViewMirror(TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_AUTO);
方案二: 改变远端观众画面
这种方案是通过设置编码器画面镜像来改变远端画面, 从而实现两端画面一致.
trtcCloud.setVideoEncoderMirror(true);
2. 如何在界面上显示一个用户两个相同的画面?
SDK 默认只支持把视频流渲染到指定组件上, 如果需要在其他组件上显示相同的画面, 可以使用 SDK 的自定义渲染功能, 把视频画面渲染到指定的组件上.
参考文档 : 自定义采集和渲染
3. 本地视频文件如何推送到 TRTC?
方案一: 自定义采集推流
使用视频解码库把本地画面解码为 SDK 可以识别的数据格式, 然后通过 SDK 的自定义采集功能, 把视频画面推流. 也可以结合摄像头画面合成为一路推流.
参考文档 : 自定义采集和渲染
方案二: 使用屏幕共享采集视频画面
先共享本地屏幕画面, 然后使用播放器打开该视频文件播放, 可以放大至全屏, 远端将看到视频画面.
参见文档: 实时屏幕分享
方案三: RTMP 推流接入 TRTC
可以在本地安装 OBS 或 FFMPEG 选择本地文件进行推流, TRTC 已经支持支持 RTMP 标准协议推流, 目前该功能在内测中.
详情参见: RTMP 协议推流
4. 怎样在视频画面中加入我家的 Logo?
很多场景除了采集摄像头画面外, 还需要添加水印或者 logo, 这时候可以通过下面方式设置:
方案一: 设置水印效果
使用 SDK 的水印接口设置 Logo, 先将你家 Logo 保存为一张图片, 然后在开始推流前调用 setWatermark()接口在指定位置设置水印. 如果需要更新水印的位置, 可以调用该接口并对位置进行更新即可.
如果您要给主画面 (一般为摄像头) 和辅路画面 (一般用作屏幕分享) 同时设置水印, 需要调用该接口两次, 并设定不同的 streamType.
参见文档: 添加水印
方案二: 自定义采集推流
SDK 提供了强大的扩展功能, 可以把 logo 图片和采集画面进行混合后, 通过自定义采集功能, 把混合后的数据推流. 该方案可以精确到每一帧, 所以支持动态的水印效果, 比如把一段视频作为水印 logo, 也可以是一些仪表盘类的动态参数显示在画面里.
参见文档: 自定义采集和渲染
5. 如何在通话画面添加美颜效果?
通过 SDK 的 setLocalVideoProcessListener()接口, 设置自定义预处理回调, 在回调里出来视频帧数据, 处理后的数据会显示在预览画面和远端画面中,过程说把采集到的视频纹理回调出来, 用于第三方美颜处理后推送.
参见文档: 美颜 SDK 接入
6. 是否可以把多个用户的画面放在一起让其他人观看?
可以的, 使用云端混流功能, 把多个用户的画面按指定的模版进行混流推流, 这时候远端只需要拉这一路流即可观看到房间内多个用户的画面.
参见文档: 云端混流转码
7. 能否把 6 个人的音视频会议录制成一个文件?
可以的, 使用云端混流功能, 把 6 个用户的画面按指定的模版进行混流推流, 然后在后台开启录制功能, 同时设置录制参数开始录制, 云端会把该显示 6 个人画面的流录制成一个文件, 并存储在云点播服务.
参见文档: 实现云端录制与回放
8. 如果有三个摄像头, 想把这三个画面都采集推流, 该如何实现?
如果设备支持同时打开三个摄像头, 可以把这三路采集到的视频帧数据, 通过算法合成一路视频帧, 然后通过自定义采集接口推流. 比如, 先创建一个 Bitmap, 然后分别把每一路视频帧画到该 Bitmap 上, 在把 Bitmap 转换为视频帧格式然后推送.
参见文档: TRTCSDK 自定义采集
参考文档
新手常见问题
音视频常见问题
代码示例
视频质量
来源: https://www.qcloud.com/developer/article/1931082