一、实现方案
通常实现一个完整的在线娃娃机场景,涉及多个功能模块 媒体服务、信令服务 等。每个功能模块下的关键动作及功能点如下表所示:
| 功能模块 | 关键动作及功能点 |
| 媒体服务 | 音视频流推流、音视频拉流 |
| 信令服务 | 远程操控 |
在线娃娃机的整体业务架构如下所示。娃娃机控制端配置了两个摄像头机位,用于对娃娃机进行视频采集和推流。当玩家进入游戏界面后,玩家会进入与该娃娃机相对应的 TRTC 房间,从而可以看到娃娃机摄像头采集的视频流。在进行游戏投币或充值后,玩家便可以开始控制娃娃机的爪子来抓取玩偶。观众同样可以加入游戏,观看玩家抓取的过程。
二、音视频推流
RTMP 推流上行
大多数市面上的网络摄像头或推流盒都具备 RTMP 推流的功能。利用腾讯云实时音视频 TRTC 的 RTMP 推流进房 功能,你可以将网络摄像头或推流盒推送的视频流直推到 TRTC 的房间中。
具体的流程如下:
1. 利用腾讯云实时音视频服务的 RTMP 生成规则,生成对应的 RTMP 推流地址。
2. 手动将 RTMP 推流地址配置到你的娃娃机上的网络摄像头或推流盒。
3. 启动 RTMP 网络摄像头或推流盒,使其将视频流推送到 TRTC 房间。
TRTC 推流上行
市面上也有与腾讯云实时音视频合作的硬件厂商,他们会在网络摄像头或推流盒上集成腾讯云实时音视频 SDK,从而能直接采集视频并推送到 TRTC 房间。
大致的流程如下:
1. 手动将 SDKAppID、UserId、RoomId、UserSig 配置到你的娃娃机上的 TRTC 网络摄像头或推流盒。
2. 启动 TRTC 网络摄像头或推流盒,使其将视频流推送到 TRTC 房间。
三、音视频拉流
当娃娃机成功将音视频流推送至腾讯云实时音视频(TRTC)房间后,无论用户是作为玩家还是观众,都可以通过进入相应的 TRTC 房间来实时观看娃娃机的画面。
大致的流程如下:
1. 业务 App 集成腾讯云实时音视频 SDK。
2. 业务服务器负责将必要的 SDK 参数,包括 SDKAppID、UserId、RoomId 以及 UserSig 等,发至业务应用程序。
3. 用户通过业务应用程序进入娃娃机对应的 TRTC 房间,并调用 TRTC SDK 提供的拉流接口,以接收并观看实时的音视频流。
四、信令服务
信令服务负责控制信令同步。通常,市场上有现成的控制硬件模块,这些模块配置了多种网络通信模式,无需相应的开发工作量,只需进行配置和调试。
信令服务通信流程如下:
1. 应用程序 App 调用业务后台的指令接口。
2. 业务后台构建16进制串口报文,随后通过 Netty 服务发送至硬件网络模块。
3. 硬件网络模块处理串口报文,并通过操作硬件的串口来控制娃娃机。
五、扩展功能
录制服务
精彩回放的功能能够显著提升用户的观看体验和互动效果。用户可以随时回看抓娃娃的精彩瞬间,尤其是成功抓取娃娃的时刻。这不仅让用户能够再次体验到成功的喜悦,还帮助他们分析并提升抓娃娃的技巧。为此借助腾讯云音视频的 TRTC 云端录制的能力,能轻松实现回放的录制。
TRTC 云端录制
TRTC 的云端录制功能,不依赖云直播的能力,使用 TRTC 内部的实时录制后台进行音视频的录制,拥有更完整统一的录制体验。
通过 TRTC 的云端录制功能,你可以将房间中的每一个用户的音视频流都录制成独立的文件(单流录制)。
或者把同一个房间的音视频媒体流合流录制成一个文件(合流录制)。
六、低时延优化方案
在线抓娃娃机方案中,对延迟的容忍度很低,因为需要配合信令对远端的机器进行控制,而信令的传输时间也是比较短的,但在一般场景下 TRTC 延迟300ms – 500ms之间,满足不了业务需求,所以需要将 TRTC 的时延降低到100ms – 300ms甚至更低。以下将通过在整个传输链路的每个点上对延迟进行优化。
1. 使用 TRTC SDK 采集推流。
通过集成腾讯云 TRTC SDK 的 网络摄像头或推流盒进行采集并直接推流至 TRTC 房间,省去了使用普通网络摄像头并通过 RTMP 流转协议分发至 TRTC 房间的步骤。这样,端到端延时可以从300ms – 500ms 进一步优化至100ms – 300ms。
2. 设置低延迟拉流。
设置低延迟拉流需要将缓冲区的 Buffer 调整为80 – 100,并设置软解码,具体的代码如下:
AndroidiOSWebJSONObject jsonObject = new JSONObject();try { jsonObject.put("api", "SetAudioCacheParams"); JSONObject params = new JSONObject(); params.put("min_cache_time", 80); // 音频本地最小cache时长 params.put("max_cache_time", 100); // 音频本地最大cache时长 jsonObject.put("params", params); mTRTCCloud.callExperimentalAPI(String.format(Locale.ENGLISH, jsonObject.toString()));} catch (JSONException e) { e.printStackTrace();}JSONObject jsonObject = new JSONObject();try { jsonObject.put("api", "setDecoderStrategy"); JSONObject params = new JSONObject(); params.put("codecType", 1); // 设置软解 jsonObject.put("params", params); mTRTCCloud.callExperimentalAPI(String.format(Locale.ENGLISH, jsonObject.toString()));} catch (JSONException e) { e.printStackTrace();}…. // 进房的相关代码NSDictionary *jsonDic = @{ @"api": @"SetAudioCacheParams", @"params": @{ @"min_cache_time": @(80), @"max_cache_time": @(100) }};NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDic options:NSJSONWritingPrettyPrinted error:nil];NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];[trtcCloud callExperimentalAPI:jsonString];NSDictionary *jsonDic = @{ @"api": @"setDecoderStrategy", @"params": @{ @"codecType": @(1) }};NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDic options:NSJSONWritingPrettyPrinted error:nil];NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];[trtcCloud callExperimentalAPI:jsonString];…. // 进房的相关代码const trtc = TRTC.create();// 进入房间try { await trtc.enterRoom({ strRoomId, scene:'rtc', sdkAppId, userId, userSig, playoutDelay: { min: 0, max: 0 } // 修改本地延迟 }); console.log('进房成功');} catch (error) { console.error('进房失败' + error);}
3. 升级最新的摄像头固件。
集成腾讯云 TRTC SDK 的网络摄像头或推流盒固件正在不断进行优化升级。在降低延迟方面,硬件厂商与 TRTC 团队正协同努力进行优化。因此,当发现存在延迟问题时,可以通过将摄像头固件升级至最新版本来优化。
4. 设置采集和编码视频参数。
# 视频编码设置编码格式:H264分辨率 : 1080P/720P/540P/360P # 根据清晰度设置比特率控制: VBR # 可变码率I帧间隔:50 # 1-200 I帧间隔越低延迟越低比特率:2000kbps/1200kbps/850kbps/550kbps # 码率设置,码率越高,清晰度越高帧率: 30 # 帧率 20-60帧BaseProfile:启用 # BaseProfile不开启B帧,能进一步降低延迟
5. 云控优化。
启用云控低延迟拉流策略,减少 jitter buffer 缓存,显著降低推拉流延迟,可以 联系我们 进行开通。
七、首帧耗时优化方案
在线上抓娃娃机/推币机场景中,首帧加载速度直接影响用户进入直播间的体验。首帧耗时是指用户点击直播间到画面首次渲染的总时长。其瓶颈可能存在于业务接口响应(如鉴权、房间信息获取)或者是业务组件加载与拉流网络资源的竞争中。因此,需要在关键链路上进行打点分析以定位瓶颈,并据此进行针对性的优化。
针对性优化:
1. 接口预加载:提前异步请求鉴权和房间信息,减少关键路径依赖。
2. TRTC 优先拉流:优先保障 TRTC 的进房拉流。在 TRTC 拉流成功后,再加载其他业务。
3. 动态降级:在弱网环境下关闭非必要功能(如礼物动画)。
八、Android 摄像头视频质量优化方案
部分摄像头未默认集成 TRTC SDK,需配合特定 Android 系统主板才能实现推流功能。为提升旧设备利用率,使用 TRTC 时可参考以下优化方案,充分发挥主板的硬件编码性能,从而提升视频推流的清晰度和流畅度,优化用户体验。
1. 自定义视频采集:直接调用系统 API 进行摄像头画面采集,可以灵活调整摄像头参数,便于代码调试。
// 开启自定义视频采集mTRTCCloud.enableCustomVideoCapture(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, true);mTRTCCloud.setDefaultStreamRecvMode(false, false);// 自定义摄像头采集private CustomCameraCapture mCustomCameraCapture;private CustomFrameRender mCustomFrameRender;// 使用视频纹理处理采集数据,降低内存消耗,并发送视频帧private CustomCameraCapture.VideoFrameReadListener mVideoFrameReadListener = new CustomCameraCapture.VideoFrameReadListener() { @Override public void onFrameAvailable(EGLContext eglContext, int textureId, int width, int height) { TRTCCloudDef.TRTCVideoFrame videoFrame = new TRTCCloudDef.TRTCVideoFrame(); videoFrame.texture = new TRTCCloudDef.TRTCTexture(); videoFrame.texture.textureId = textureId; videoFrame.texture.eglContext14 = eglContext; videoFrame.width = width; videoFrame.height = height; videoFrame.pixelFormat = TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D; videoFrame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE; mTRTCCloud.sendCustomVideoData(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG ,videoFrame); }};mCustomCameraCapture = new CustomCameraCapture();mCustomFrameRender = new CustomFrameRender(mUserId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);// 开启摄像头采集mCustomCameraCapture.startInternal(mVideoFrameReadListener);// 设置自定义渲染mTRTCCloud.setLocalVideoRenderListener(TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D, TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE, mCustomFrameRender);final TextureView textureView = new TextureView(this);mLocalRenderView.addVideoView(textureView);mCustomFrameRender.start(textureView);
注意:说明:
注意:自定义视频预处理完整代码,可以参考 Demo。
2. 视频硬编码:使用实验性接口 callExperimentalAPI,设置宽高均为16的倍数来适配 Android 设备的硬件编码参数。以下是两组可供参考的视频参数:
·高分辨率编码参数:768×1024 20fps 1500kbps。
·中分辨率编码参数:480×640 20fps 900kbps。
public static final int ENCODE_WIDTH = 480;public static final int ENCODE_HEIGHT = 640;JSONObject jsonObject = new JSONObject();try { jsonObject.put("api", "setVideoEncodeParamEx"); JSONObject params = new JSONObject(); params.put("codecType", 1); params.put("videoWidth", ENCODE_WIDTH); params.put("videoHeight", ENCODE_HEIGHT); params.put("videoFps", 20); params.put("videoBitrate", 1500); params.put("minVideoBitrate", 300); params.put("streamType", 0); params.put("resolutionMode", 1); jsonObject.put("params", params);} catch (JSONException e) { throw new RuntimeException(e);}mTRTCCloud.callExperimentalAPI(jsonObject.toString());
3. Speech 音频采集:由于对低延迟的需求,需要使用音频功能。但 Android 设备的音频性能可能不足,若采用默认音质,性能可能无法满足要求。因此,建议调用 startLocalAudio 接口,并设置 TRTC_AUDIO_QUALITY_SPEECH 参数。
mTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);
4. 使用最新 Android SDK:新版本 Android 端的 SDK 会持续优化,所以请使用最新的 Android 进行调试。
九、方案配套产品
| 系统层级 | 产品名称 | 场景用途 |
| 接入层 | 实时音视频 TRTC | 提供低延时、高品质的音视频实时互动解决方案,是音视频通话场景的基础底座能力。 |
| 云端服务 | 云点播 VOD | 面向音视频媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。 |
| 数据存储 | 对象存储 COS | 提供音视频录制文件、音视频切片文件的存储服务。 |