前言
在物联网和智能设备快速发展的今天,实时音视频传输成为了一个重要的技术需求。Amazon Kinesis Video Streams (KVS) 提供了一套完整的 WebRTC SDK,帮助开发者快速实现设备端的实时音视频通信功能。本文将详细介绍 WebRTC 的基本概念、架构原理,以及如何使用 Amazon KVS WebRTC SDK 进行开发。
一、WebRTC 概述
1.1 什么是 WebRTC
WebRTC(Web Real-Time Communication)是一个支持浏览器和移动应用进行实时音视频通信的开源项目。它允许网络应用或站点在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。

1.2 为什么需要 WebRTC

WebRTC 的出现解决了传统实时通信中的诸多痛点:
- 低延迟:端到端直连,减少中间服务器转发
- 标准化:浏览器原生支持,无需安装插件
- 开源免费:降低开发成本
- 安全性:内置 SRTP 加密
1.3 WebRTC 的优势

主要优势包括:
- NAT 穿越:通过 ICE 框架实现网络穿透
- 自适应码率:根据网络状况动态调整
- 回声消除:内置音频处理模块
- 跨平台:支持 Windows、Linux、macOS、Android、iOS
二、WebRTC 架构详解
2.1 整体架构

WebRTC 的核心架构主要包含以下几个部分:
- 信令(Signaling):负责会话建立、媒体协商
- STUN/TURN 服务器:协助 NAT 穿越
- ICE 框架:收集和交换候选地址
- 媒体引擎:音视频编解码
2.2 连接建立流程

典型的 WebRTC 连接建立流程:
- 双方通过信令服务器交换 SDP(Session Description Protocol)
- 通过 ICE 框架收集网络候选地址(Candidate)
- 通过 STUN/TURN 服务器进行 NAT 穿越
- 建立 P2P 连接,开始音视频传输
三、Amazon KVS WebRTC SDK
3.1 KVS WebRTC 简介
Amazon Kinesis Video Streams WebRTC SDK 是 AWS 提供的一套完整的 WebRTC 实现,特别适合物联网设备的实时音视频场景。

3.2 KVS WebRTC 核心组件

KVS WebRTC SDK 包含以下核心组件:
- 信令通道(Signaling Channel)
- 负责 Peer 之间的 SDP 交换
- 支持多对多通信
- 提供持久化存储

- TURN 服务器
- AWS 托管的 TURN 服务
- 支持 STUN/TURN 协议
- 自动 NAT 穿越

- Master/Viewer 模型
- Master:发布音视频流
- Viewer:订阅音视频流
- 支持一对多广播

3.3 KVS WebRTC 架构优势
- 全托管服务:无需自建信令和 TURN 服务器
- 全球覆盖:AWS 全球区域支持
- 高可用性:99.9% SLA 保障
- 安全合规:支持 IAM 权限控制、传输加密
四、其他厂商 WebRTC 方案对比
4.1 海康门禁 WebRTC
海康威视在其门禁产品中集成了 WebRTC 功能,主要用于:
- 远程视频对讲
- 门禁实时预览
- 移动端查看


海康门禁其他界面



4.2 威视通 WebRTC
威视通提供的 WebRTC 方案主要应用于网络摄像机和 NVR 设备。
局域网访问
在局域网环境下,通过浏览器可以直接访问设备的 WebRTC 流:
Google Chrome 浏览器:

Microsoft Edge 浏览器:


支持的协议
除了 WebRTC,威视通设备还支持多种流媒体协议:
- RTSP:实时流协议,广泛用于监控设备
- RTMP:实时消息协议,常用于直播推流
- ONVIF:网络视频设备互操作标准
- SIP:会话初始协议,用于 VoIP
- SRT:安全可靠传输协议
五、WebRTC 协议栈实现方案
5.1 技术选型
在设备端实现 WebRTC,推荐使用以下技术栈:
mongoose (轻量级 Web 服务器) + kvs (amazon-kinesis-video-streams-webrtc-sdk-c)
5.2 局域网部署方案
局域网环境下,Web 端本地预览需要支持信令交互。
Web 端文件:
adapter.js - WebRTC 适配层
adapter.min.js - 压缩版本
demo.css - 样式文件
jquery-3.0.0.min.js - jQuery 库
index.html - 主页面
设备端要求:
- 实现信令服务器(Web Server)
- 支持 WebRTC 信令交互
- 处理 SDP 交换
STUN 服务器地址:
stun:stun.kinesisvideo.us-west-2.amazonaws.com:443
stun:stun.kinesisvideo.ap-east-1.amazonaws.com:443
5.3 公网部署方案
公网访问需要将信令服务器部署在公网,类似米家、海康、TUTK、涂鸦等厂商的方案。
开源信令服务器选择:
- PeerJS:https://peerjs.com/
- Saltyrtc:https://github.com/saltyrtc
5.4 设备支持 WebRTC 的关键点
-
音视频流管理
- 建议使用共享内存(单生产者 -> 多消费者模式)
- 支持 WebRTC、Web Server、RTSP、RTMP、SIP、NVR、FLV、HTTP 等多路复用
-
协议栈集成
- KVS WebRTC SDK:https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c
- 实现设备端 WebRTC 交互
- 实现信令交互服务
-
客户端支持
- Web 端、移动端、设备端均可作为 Peer
-
服务器设计
- 信令服务器(局域网/互联网)
- STUN/TURN 服务
- ICE 服务
六、编译指南
6.1 编译 libwebsockets
libwebsockets 是 KVS WebRTC SDK 的重要依赖,需要先进行编译:
bash
# 克隆源码
git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets/
git checkout v4.3.3
# 应用补丁(解决旧版本 GCC 兼容问题)
git apply --verbose --ignore-whitespace \
/root/amazon-kinesis-video-streams-webrtc-sdk-c/CMake/Dependencies/libwebsockets-old-gcc-fix-cast-cmakelists.patch
# 配置交叉编译(以海思平台为例)
cmake -DCMAKE_C_COMPILER=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc \
-DCMAKE_CXX_COMPILER=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++ \
-DCMAKE_INSTALL_PREFIX=$PWD/install \
-DCMAKE_C_FLAGS="-fPIC" \
-DLWS_WITH_HTTP2=1 \
-DLWS_HAVE_HMAC_CTX_new=1 \
-DLWS_HAVE_SSL_EXTRA_CHAIN_CERTS=1 \
-DLWS_HAVE_OPENSSL_ECDH_H=1 \
-DLWS_HAVE_EVP_MD_CTX_free=1 \
-DLWS_WITHOUT_SERVER=1 \
-DLWS_WITHOUT_TESTAPPS=1 \
-DLWS_WITHOUT_TEST_SERVER_EXTPOLL=1 \
-DLWS_WITHOUT_TEST_PING=1 \
-DLWS_WITHOUT_TEST_CLIENT=1 \
-DLWS_STATIC_PIC=1 \
-DLWS_WITH_STATIC=1 \
-DLWS_WITH_SHARED=0 \
-DLWS_WITH_MBEDTLS=OFF \
-DLWS_WITH_MINIMAL_EXAMPLES=1 \
-DLWS_HAVE_PTHREAD_H=1 \
-DLWS_WITH_THREADPOOL=0 \
-DLWS_WITH_ZLIB=0 \
-DLWS_HAVE_EVENTFD=0 \
-DLWS_OPENSSL_INCLUDE_DIRS="/root/temp/arm_build/openssl/include/" \
-DLWS_OPENSSL_LIBRARIES="/root/temp/arm_build/openssl/lib/libssl.so;/root/temp/arm_build/openssl/lib/libcrypto.so" \
..
# 编译安装
make
make install
6.2 编译 KVS WebRTC SDK
安装依赖(Ubuntu/Debian)
bash
sudo apt-get install cmake m4 pkg-config libssl-dev libcurl4-openssl-dev \
liblog4cplus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools
编译 SDK
bash
# 克隆仓库(包含子模块)
git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c.git
# 创建构建目录
mkdir -p amazon-kinesis-video-streams-webrtc-sdk-c/build
cd amazon-kinesis-video-streams-webrtc-sdk-c/build
# 配置和编译
cmake ..
make
七、运行示例
7.1 配置 AWS 凭证
在运行示例之前,需要配置 AWS 凭证:
bash
export AWS_ACCESS_KEY_ID=<你的 Access Key ID>
export AWS_SECRET_ACCESS_KEY=<你的 Secret Access Key>
export AWS_DEFAULT_REGION=us-east-1
注意:请勿将真实的 AWS 凭证提交到代码仓库或公开分享。
7.2 启用调试日志
bash
export AWS_KVS_LOG_LEVEL=LOG_LEVEL_DEBUG
export DEBUG_LOG_SDP=TRUE
7.3 运行 Master 示例
bash
# 使用 GStreamer 示例(支持音视频)
./kvsWebrtcClientMasterGstSample demo-webrtc-channel
# 使用基础示例
./kvsWebrtcClientMaster demo-webrtc-channel
7.4 AWS 控制台配置
在 AWS 控制台中,需要配置以下信息:
AWS Credentials:
- Access Key ID
- Secret Access Key
- Session Token(可选)
Signaling Channel:
- Channel Name:信令通道名称
- Client Id(可选):客户端标识
八、总结
Amazon Kinesis Video Streams WebRTC SDK 为物联网设备的实时音视频通信提供了完整的解决方案。相比自建 WebRTC 服务,KVS 具有以下优势:
- 开箱即用:无需搭建和维护信令服务器、TURN 服务器
- 全球覆盖:利用 AWS 全球基础设施
- 安全可靠:IAM 权限控制 + 传输加密
- 成本优化:按使用量付费,无需前期投入
对于需要在嵌入式设备上实现 WebRTC 功能的开发者,KVS WebRTC SDK 是一个值得考虑的选择。
参考资料
原创文章,转载请注明出处!