跑通示例源码
本文介绍如何快速跑通示例源码,体验基础的音视频流录制功能。
前提条件
-
已在 ZEGO 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理 中的“项目信息”。
-
开发和运行环境需满足以下要求:
- 操作系统与架构:x86_64 架构的 Linux 操作系统
- C 运行库:glibc 2.18 或以上
- C++ 编译器:GCC / G++ 4.8.5 或以上,启用 C++11
- 构建工具:CMake 3.21.2 或以上、Make
- 命令行工具:Bash、curl、unzip
- 底层依赖库:libasound(ALSA)、libv4l2(v4l utils)
说明- SDK 依赖 libasound (ALSA) 和 libv4l2 (v4l utils)。
- CentOS (RHEL/Fedora) 可以通过执行
yum install alsa-lib-devel libv4l-devel命令安装。 - Ubuntu (Debian/Deepin) 可以通过执行
apt install libasound2-dev libv4l-dev命令安装。 - 其他平台和系统请自行安装。
- 若需要交叉编译,请参考 如何交叉编译 Linux alsa-lib 依赖库? 和 如何交叉编译 Linux v4l-utils 依赖库? 两篇文档,同时目标机器需安装好 libasound 和 libv4l2 依赖库。
可通过以下命令检查服务器的运行环境是否符合要求:
uname -m # 应输出 x86_64 getconf GNU_LIBC_VERSION # 应为 glibc 2.18 或以上 g++ --version cmake --version make --version
下载示例源码
本地下载 Linux - C++
示例源码目录结构
.
├──docs
└──cpp
├── CMakeLists.txt
├── README.md
├── build.sh
├── demo_config.yaml
├── run.sh
├── sdk
│ ├── Document
│ ├── Library
│ └── VERSION.txt
└── src
├── CommandLine.h
├── LiveRoomRecorder.cpp
├── LiveRoomRecorder.h
├── RecorderConfig.h
├── Yaml.cpp
├── Yaml.hpp
└── main.cpp运行示例源码
解压并进入示例源码目录。
构建项目。
bash build.sh构建产物为 build/playrecorderdemo。
修改项目配置文件。
# 复制配置文件模版
cp demo_config.yaml local_config.yaml首次运行可保留模板中的 mode: 1、room_mode: 0、muxer_out_type: 1、suffix: "mp4" 和 single.fragment: 0。然后填写以下的主要配置:
appid:替换为 ZEGO 控制台 获取的 AppID。use_token: 是否使用 token 鉴权,1 使用,0 不使用。不使用 Token 鉴权时(0)填写app_sign字段;使用 Token 鉴权时(1),填写token_list字段且保持app_sign: "none"。room_list:替换为正在推流的房间 ID,保留字符串引号。user_id、user_name:设置录制用户身份。log_path:设置可写的绝对目录,例如/home/your-user/recorder-output,实际路径须存在或允许创建。
包含 AppSign 或 Token 的本地配置请妥善保存,不要提交到代码仓库。
| 字段 | 配置要求 |
|---|---|
appid | 应用 ID,正整数;推流端与录制端使用同一应用 |
use_token | 1 使用 Token,0 使用 AppSign |
app_sign | AppSign 鉴权时填写 64 个十六进制字符;Token 鉴权时保留 none |
token_list | Token 鉴权时与 room_list 顺序和数量一致;使用服务端为录制用户签发的 Token |
room_list | 房间 ID 字符串列表,数字型 ID 也加引号,避免丢失前导零 |
user_id / user_name | 录制用户身份,不能与房间中其他用户重复;Token 中的身份需匹配 user_id |
room_mode | 0 单房间,仅使用 room_list 第一个元素;1 多房间 |
mode | 1 单流;2 混流;3 同时录制单流和混流 |
log_path | 日志及示例录制文件的根目录,建议绝对路径;启动时打印本次会话目录 |
persistence_path | SDK 持久化配置路径;示例仍显式将录制和截图输出到本次会话目录 |
suffix | 初次验证使用 mp4;音频录制可用 mp3 |
muxer_out_type | 验证文件录制使用 1;2 仅回调数据,本 demo 未实现回调数据持久化 |
single.fragment | 单流分片间隔,初次 MP4 验证设 0,停止后检查完整文件 |
mix.fragment | 混流分片间隔,初次 MP4 验证设 0 |
mix.output_width / mix.output_height | 混流画布宽高,例如 1280 × 720 |
mix.output_fps / mix.output_bitrate | 混流视频帧率及码率,单位分别为 fps、bps |
运行示例 Demo 。
bash run.sh start --config ./local_config.yamlrun.sh会保留调用者的当前工作目录,因此配置文件及配置中的相对路径均以执行命令时所在目录为基准。建议服务部署时统一使用绝对路径。- Demo 初始化成功后会自动登录房间并录制发现的流,无需手动输入
record start启动录制。
启动录制后,可根据终端输出检查录制进度:
- 初始化回调错误码为
0。 - 登录回调错误码为
0,房间 ID 与配置一致。 - 流更新回调出现预期的 stream ID。
- 录制开始回调给出文件路径。单流可用
record status辅助观察时长和大小;混流请检查录制回调和停止后的输出文件。 - 录制一段时间后输入
stop,检查录制结束回调和log_path输出的文件;再执行exit。
如已安装 FFmpeg,可检查输出文件:
ffprobe -v error -show_entries format=duration,size \
-show_entries stream=codec_type,codec_name,width,height \
-of json /absolute/path/to/recording.mp4单流录制成功后,先执行 stop,将配置中的 mode 改为 2、mix.fragment 改为 0,再重新启动。检查混流文件的布局和声音,并尝试 mix pause、mix resume。使用 mode: 3 时会同时生成单流和混流文件,两类文件都需要检查。
| 命令 | 用途 |
|---|---|
start --config ./demo_config.yaml | 加载配置、初始化、登录配置中的房间,并自动录制新增流。路径含空格时请使用单引号或双引号。 |
stop | 停止录制、退出房间并释放 SDK;之后可以重新 start |
room login --room-id room1 | 登录指定房间;多房间操作需在初始化前配置 room_mode |
room logout --room-id room1 | 退出指定房间 |
room set-token --room-id room1 --token-file ./room1.token | 为房间设置或更新 Token;文件为 UTF-8 单行文本,可带末尾换行 |
record start --room-id room1 --stream-id stream1 | 手动启动指定单流录制 |
record stop --room-id room1 --stream-id stream1 | 手动停止指定单流录制 |
record status | 查询录制时长、大小和路径 |
mix pause / mix resume | 暂停或恢复正在进行的混流录制 |
stream sei | 查询已发现流的最近 SEI 时间 |
snapshot --stream-id stream1 | 对单流截图 |
snapshot --mix | 对混流截图 |
help / start --help | 查看命令帮助 |
exit | 停止录制并退出程序 |
stream-id应从流更新回调中取得,不能用房间 ID 代替。自动录制已启动的流不需要再执行record start。- 输入结束(EOF)会自动停止运行,因此不要使用
echo 'start ...' | ...启动持续录制。 - 通过启动参数执行 start 后,保持终端输入打开,录制完成后输入
exit停止录制并退出程序。
常见问题
检查应用 ID、鉴权配置和 SDK 日志;API 返回 true 仅说明请求被接受
核对应用、房间、用户 ID;Token 是否过期,是否签发给该录制用户
确认推流端使用同一应用和房间并已开始推流;房间 ID 与流 ID 是不同概念
看录制开始/结束回调、资源模式、输出目录权限和磁盘空间;muxer_out_type 应为 1
先正常 stop,等待文件封装完成后检查;强制结束进程可能留下未完成文件
检查画布宽高、输入流数量与矩形坐标;横坐标不超过宽,纵坐标不超过高
等待初始化结果后操作;初始化失败后修正配置再 start
