ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

bililive-go 直播录制自动化测试框架实战指南:基于 osrp-stream-tester 的 dev 包全场景验证

2026/10/4 15:59:36 拓冰建站 浏览量
bililive-go 直播录制自动化测试框架实战指南:基于 osrp-stream-tester 的 dev 包全场景验证 后端音视频视频【免费下载链接】bililive-go一个直播录制工具项目地址https://gitcode.com/gh_mirrors/bi/bililive-go点击查看免费下载导读本文围绕 bililive-go 中专门为直播录制功能打造的 dev 自动化测试框架展开讲解如何利用模拟直播流服务器 osrp-stream-tester在本地与 CI 环境中对录制器进行多格式、多编码、多分辨率以及网络故障与流结构异常下的全场景验证。读完本文你将掌握 dev 包的运行方式、11 个预定义测试场景的语义、结果验证机制、多流选择测试方法以及如何将这套框架接入 Playwright E2E 与持续集成流水线。一、框架定位为什么直播录制工具需要一套假直播测试框架直播录制程序天然依赖外部直播平台与网络环境很难在开发阶段稳定复现断流、限速、分辨率突变、时间戳异常等真实故障。bililive-go 在src/live/dev/目录下提供了一个带dev构建标签的独立测试框架文档自称bgo 自动化测试框架其核心思路是用测试服务器替代真实平台dev 包不连接任何真实直播平台而是与本地运行的 osrp-stream-tester 服务器交互后者可以按需生成任意规格的模拟直播流把异常变成可控输入网络断连、限速、分辨率变化、时间戳跳跃等故障都可以作为参数注入从而验证录制器在各种极端条件下的表现自动验证与报告测试运行器自动启动录制、用 ffprobe 校验输出文件、比对录制时长并输出结构化测试报告。从实现看dev 包是 bililive-go 平台抽象层的一个测试平台实现它通过live.Register注册了localhost:8080、localhost:8888、127.0.0.1:8080、127.0.0.1:8081等多个端口对应的 builder见 dev.go因此向 bgo 添加一个指向这些端口的房间 URL就会走 dev 平台的逻辑而不会真的去请求外部站点。二、框架组成三个文件各司其职dev 包源码由三个带//go:build dev标签的文件构成目录结构如下src/live/dev/ ├── dev.go # Live 接口实现与测试服务器交互 ├── test_scenarios.go # 测试场景定义11个预定义场景 └── test_runner.go # 测试运行器和结果验证文件职责关键实现dev.go实现live.Live接口的平台层GetInfo()L52、GetStreamInfos()L112、fetchAvailableStreams()L171、generateTestStreams()L236test_scenarios.go定义场景数据结构与 11 个预置场景TestScenario、StreamConfig、FaultConfig、Expected结构体GetAvailableScenarios()L176SaveScenarios()L416test_runner.go调度录制、验证输出、生成报告TestServer服务器客户端、RunScenario()L41、RunAllScenarios()L121、PrintReport()L248三者形成清晰分层场景描述数据→ 平台交互流获取→ 执行验证录制与断言。同时dev_init.go 通过空导入_ github.com/bililive-go/bililive-go/src/live/dev将 dev 平台注册进主程序该文件同样受dev构建标签保护因此只有带标签构建的 bgo 才包含测试平台。三、快速上手搭建最小可运行的测试环境1. 启动测试流服务器osrp-stream-tester 是 dev 框架的流源需先以 serve 模式启动。README 给出了本地克隆后启动的方式cd ../kira-works/osrp-stream-tester go run ./cmd/stream-tester serve --port 8888如果不方便手动克隆仓库的 playwright.config.ts 展示了一条等价捷径——直接用go run拉取并运行最新版也支持通过OSRP_STREAM_TESTER_PATH环境变量指向本地源码目录go run github.com/kira1928/osrp-stream-tester/cmd/stream-testerlatest serve --port 8888启动后用健康检查确认服务可用curl http://localhost:8888/health # 应返回: {status:ok}2. 构建带 dev 标签的 bgodev 包的全部代码都带有//go:build dev标签只有显式启用该标签才会被编译进二进制go build -tags dev ./...这一点与 E2E 流水线的用法一致——playwright.config.ts 中启动 bgo 测试实例时使用的正是go run -tags dev ./src/cmd/bililive。3. 准备依赖工具框架的录制与验证环节依赖三个外部组件osrp-stream-tester测试流服务器流源ffmpeg用于拉流录制runFFmpeg以-c copy模式直录见 test_runner.goffprobe用于读取输出文件的时长进行验证test_runner.go。确保 ffmpeg 与 ffprobe 已在PATH中README 建议使用包管理器安装macOSbrew install ffmpeg、Ubuntusudo apt install ffmpeg、Windowschoco install ffmpeg。四、运行测试的两种方式方式 A代码中运行全部场景TestRunner 封装了健康检查 → 构建流 URL → ffmpeg 录制 → 输出验证 → 结果判定的完整链路//go:build dev package main import ( context github.com/bililive-go/bililive-go/src/live/dev ) func main() { ctx : context.Background() // 创建测试运行器服务器地址 输出目录 runner : dev.NewTestRunner(http://localhost:8888, ./test_output) // 运行所有场景 results, err : runner.RunAllScenarios(ctx) if err ! nil { panic(err) } // 打印报告 dev.PrintReport(results) }RunAllScenarios会遍历GetAvailableScenarios()返回的全部 11 个场景并逐个执行test_runner.go日志默认开启Verbose: true。方式 B单独运行自定义场景针对某个特定问题可以只运行一个场景并完全自定义流的规格与预期scenario : dev.TestScenario{ Name: custom_test, Description: 自定义测试, Stream: dev.StreamConfig{ Format: flv, Codec: avc, Duration: 30 * time.Second, Quality: 1080p, }, Expected: dev.Expected{ OutputPlayable: true, MinDuration: 25 * time.Second, }, } result, _ : runner.RunScenario(ctx, scenario)RunScenario的关键流程test_runner.go值得展开对测试服务器执行健康检查失败则直接记录错误返回依据场景的Formatflv/hls拼装流 URL形如http://server/live/name.flv?codecavcquality1080pduration30按格式选择输出扩展名FLV 用.flvHLS 用.ts在输出目录中准备文件以recordCtx场景时长 30 秒余量调用runFFmpeg执行ffmpeg -y -i url -c copy -t duration output用validateOutput校验文件存在性、非空性并通过 ffprobe 读取时长最终判定OutputPlayable OutputDuration MinDuration即通过。五、11 个预定义测试场景全景GetAvailableScenarios()test_scenarios.go共预置 11 个场景分为四类覆盖录制功能的主要风险面。基础功能4 个场景描述流配置basic_flv_h264FLV H.264 基础录制flv / avc / 1080p / 30sbasic_flv_hevcFLV H.265 录制flv / hevc / 1080p / 30sbasic_hls_h264HLS H.264 录制hls / avc / 1080p / 30sannexb_hevc非标准 Annex B HEVCflv / hevc-annexb / 1080p / 30s其中annexb_hevc是特殊用例FLV 容器中携带 Annex B 格式的 HEVC 序列头属于非标准做法其Expected中带有合规性警告annexb_sequence_header序列头使用了非标准的 Annex B 格式用于确认录制器在这种不规范输入下仍能产出可播放文件。网络故障2 个场景描述故障注入network_disconnect_5s网络断开 5 秒后恢复第 10 秒注入disconnect持续 5 秒期望DownloaderReconnects: true、输出 ≥ 50sslow_network网络限速到 1Mbps第 5 秒注入slowdown持续 20 秒参数bandwidth_kbps: 1000network_disconnect_5s的场景期望中显式声明了DownloaderReconnects: true即验证下载器具备断线重连能力slow_network则将流降到 720p 以适配限速带宽验证低带宽下的录制稳定性。流结构异常4 个场景描述故障注入resolution_change分辨率变化 1080p→720p第 20 秒注入参数new_width: 1280, new_height: 720timestamp_jump时间戳向前跳跃 10 秒第 20 秒注入参数jump_ms: 10000timestamp_reset时间戳归零第 30 秒注入timestamp_resetdrop_frames30% 丢帧率第 10 秒注入drop_frame持续 5 秒参数drop_rate: 0.3这些场景专门考验录制器对格式合法但结构异常输入的容忍度——真实直播中因推流端抖动、CDN 切换等引发的分辨率突变、时间戳回退正是录制文件损坏的常见诱因。多流测试1 个场景描述multi_stream_selection多流选择功能20s 流输出 ≥ 15s六、结果验证机制与测试报告验证逻辑validateOutputtest_runner.go的验证链条为os.Stat检查输出文件是否存在不存在即失败文件大小是否为 0为空则报输出文件为空调用ffprobe -v quiet -show_entries formatduration -of csvp0 file读取媒体时长若 ffprobe 成功则标记OutputPlayable true并记录OutputDuration即使 ffprobe 失败只要文件存在且有大小也会乐观标记为可播放时长记 0。Expected结构体还预留了更多断言维度test_scenarios.goMaxFileSizeDiff允许的文件大小差异百分比、DownloaderReconnects、ComplianceWarnings等方便扩展更精细的校验。报告输出PrintReport会汇总所有结果并打印统计报告README 给出的示例格式如下 测试报告 总计: 11 | 通过: 9 | 失败: 2 -------------------------------------------------------------- ✅ PASS basic_flv_h264 (35.2s) ✅ PASS basic_flv_hevc (33.8s) ⚠ FAIL annexb_hevc (31.5s) 错误: 输出文件不可播放 ✅ PASS basic_hls_h264 (34.1s) ✅ PASS network_disconnect_5s (68.3s) ... ⚠ 2 个测试失败TestResult结构体test_scenarios.go记录场景名、是否成功、耗时、输出路径、可播放性、输出时长、文件大小、错误信息、重连次数与警告列表既可以打印也便于序列化为 JSON 供 CI 收集。七、与 osrp-stream-tester 的集成协议服务器 APIdev 包作为 osrp-stream-tester 的客户端会调用以下端点README 原文GET /health - 健康检查 GET /api/streams/{id} - 获取流信息 GET /live/{name}.flv - FLV 流 GET /hls/{name}.m3u8 - HLS 流在源码层面TestServer客户端test_runner.go还支持更完整的控制面 APIPOST /api/streams按StreamConfig启动测试流、POST /api/streams/{id}/faults注入故障、DELETE /api/streams/{id}停止流。而 dev 平台的GetInfo会请求GET /api/streams/{roomName}并把响应中的title、streamer、live字段映射为 bgo 的Infodev.go响应结构体StreamAPIResponse定义了id/title/streamer/live/format/codec/duration字段。流 URL 查询参数流 URL 支持三个查询参数README 原文参数说明示例codec视频编码avc,hevc,hevc-annexbquality分辨率1080p,720p,480pduration流时长(秒)30,60完整示例http://localhost:8888/live/test.flv?codechevcquality1080pduration30当 dev 平台直接收到以.flv/.m3u8结尾的流 URL 时GetStreamInfos会依据查询参数解析出单个流的清晰度、编码与分辨率宽度/高度由parseQuality映射dev.go编码名会经normalizeCodec规范化——avc→h264、hevc→h265、hevc-annexb→h265dev.go。八、多流支持验证 bgo 的流选择功能dev 平台实现了完整的多流能力。当访问的是房间 URL不带流扩展名时GetStreamInfos会优先调用GET /api/streams/{roomName}/available从测试服务器拉取真实可用流列表dev.go每个流条目包含 URL、格式、清晰度、编码、宽高、码率与属性标签若 API 不可用则回退到generateTestStreams生成的标准测试流列表dev.go// - 1080p FLV H.264 (6000kbps) // - 1080p FLV H.265 (4000kbps) // - 720p FLV H.264 (3000kbps) // - 480p FLV H.264 (1500kbps) // - 1080p HLS H.264 (6000kbps) // - 720p HLS H.264 (3000kbps) // - 1080p FLV HEVC-AnnexB (4000kbps) // 特殊测试这份流列表会填充live.StreamUrlInfo结构体定义于 lives.go的Quality/Format/Codec/Width/Height/Bitrate/AttributesForStreamSelect字段并附带User-Agent: bililive-go-test下载请求头。由于这些字段正是 bgo 前端流选择下拉框与录制器选择逻辑的数据来源dev 平台由此可以直接驱动 bgo 的多流选择功能测试这也是multi_stream_selection场景存在的基础。九、扩展测试场景添加新场景在GetAvailableScenarios()的返回值中追加一个TestScenario即可故障可自由组合{ Name: my_custom_test, Description: 自定义测试场景, Stream: StreamConfig{ Format: flv, Codec: avc, Duration: 60 * time.Second, Quality: 1080p, }, Faults: []FaultConfig{ { Type: disconnect, At: 20 * time.Second, Duration: 10 * time.Second, }, }, Expected: Expected{ OutputPlayable: true, MinDuration: 50 * time.Second, DownloaderReconnects: true, }, },FaultConfigtest_scenarios.go的Type字段支持disconnect、delay、slowdown、resolution_change、timestamp_jump等故障类型At指定触发时刻Duration指定持续时长Params可携带bandwidth_kbps、new_width、new_height、jump_ms、drop_rate等额外参数。导出场景到文件场景定义支持序列化为 JSON供 osrp-stream-tester 直接消费scenarios : dev.GetAvailableScenarios() dev.SaveScenarios(./scenarios, scenarios) // 生成 JSON 文件供 osrp-stream-tester 使用SaveScenariostest_scenarios.go会在目标目录下按场景名逐个写出美化后的 JSON 文件如basic_flv_h264.json实现场景定义与测试服务器解耦。十、接入 Playwright E2E 与 CI/CDMakefile 快捷命令README 记录了三条 Playwright 相关命令仓库 Makefile 中均有对应实现# 安装依赖首次 make install-e2e # 运行测试 make test-e2e # 带 UI 运行测试调试用 make test-e2e-uiinstall-e2e实际执行yarn install --frozen-lockfile与npx playwright install --with-deps chromium。E2E 测试配置playwright.config.ts 是整套 E2E 的编排核心它同时启动三个 Web 服务L90-L127update-mock-servertest/update-mock-server模拟版本 API服务于更新相关测试osrp-stream-testerserve --port 8888作为测试流服务器bililive-go 主程序本地用go run -tags dev ./src/cmd/bililive --config test-output/test-config.ymlCI 中使用预编译的./bin/bililive-dev。其余关键配置testDir: ./tests/e2e、workers: 1共享服务器不并行、timeout: 30s、baseURL: http://127.0.0.1:8080、失败时截图与录制 trace。运行所需的 bgo 配置模板位于 tests/e2e/fixtures/test-config.template.yml运行时复制到test-output/test-config.yml以避免被 git 跟踪。测试用例示例E2E 用例位于tests/e2e/README 列出了两个代表性文件文件描述basic.spec.ts基础 UI 功能测试recording.spec.ts直播录制功能测试以 recording.spec.ts 为例它通过 UI 添加http://127.0.0.1:8888/live/test.flv这个 dev 直播间随后验证/health、/api/streams/test、/api/streams/test/available、/api/lives、/api/config、/api/info等接口与录制状态展示。测试前后还会通过/api/lives快照对比只清理本文件新建的 dev 直播间避免误删开发者已有的监控房间。CI 流水线参考README 提供了一份 GitHub Actions 工作流参考适用于 push / pull_request 触发核心步骤为checkout → setup-go1.23→ 安装 ffmpeg → 启动 stream-testergo run ./cmd/stream-tester serve --port 8888 等待 3 秒→go test -tags dev ./src/live/dev/...→ 上传test_output/结果产物。注意该示例中的working-directory: ../osrp-stream-tester表明 CI 中同样需要先就位 osrp-stream-tester 源码本地 E2E 也可参考 playwright.config.ts 中的go run ...latest方案。十一、常见故障排查测试服务器连接失败报错特征测试服务器不可达: connection refused该错误文本来自TestServer.HealthChecktest_runner.go。处理方式确认 osrp-stream-tester 已启动并监听 8888 端口用 curl 验证curl http://localhost:8888/health # 应返回: {status:ok}FFmpeg 未找到报错特征exec: ffmpeg: executable file not found。处理方式按平台安装 ffmpegmacOSbrew install ffmpeg、Ubuntusudo apt install ffmpeg、Windowschoco install ffmpeg并确保ffmpeg、ffprobe均在PATH中。输出文件为空检查流 URL 是否正确codec/quality/duration 参数是否合法并查看测试服务器日志确认流是否正常生成若为自定义场景还应核对Expected.MinDuration是否大于实际流时长。十二、路线图框架的演进方向README 明确列出了后续规划可作为二次开发的参考已完成Playwright E2E 测试集成——Playwright 已加入项目创建了测试配置与基础用例osrp-stream-tester 作为测试流服务器接入并添加了 GitHub Actions 工作流完善 osrp-stream-tester——实现更多故障注入类型、添加流控制 API添加更多场景——长时间录制24 小时、极端网络条件、并发录制测试。构建标签dev|框架位置src/live/dev/ |配套 E2E 配置playwright.config.ts这套框架把直播录制工具的健壮性从难以验证的经验问题转化为可在本地一键复现、在 CI 中自动回归的工程问题。无论是为 bililive-go 贡献新的录制器行为修复还是评估录制链路对异常流的容忍度src/live/dev/都是最直接的入口。赞分享后端音视频视频【免费下载链接】bililive-go一个直播录制工具项目地址https://gitcode.com/gh_mirrors/bi/bililive-go点击查看免费下载相关推荐Bililive-go直播录制工具多平台自动化录播终极指南还在为错过心爱主播的精彩直播而烦恼吗Bililive go作为一款功能强大的开源直播录制工具能够帮你轻松解决这个问题。这款工具支持抖音、B站、斗鱼、虎牙等2后端音视频视频Bililive-go终极指南5步搭建全平台自动化直播录制系统Bililive go终极指南5步搭建全平台自动化直播录制系统 Bililive go是一款强大的直播录制工具能够帮助用户轻松实现抖音、B站、斗鱼等20主后端音视频视频WWDC Session Notes开发者必备的204个技术会话快速指南WWDC Session Notes开发者必备的204个技术会话快速指南 作为苹果开发者每年最期待的盛事莫过于 WWDC全球开发者大会 。然而面对数百个技上一篇OpenProject 日程与可用性配置完全指南工作排程、未来计划与休假管理下一篇在 .NET Aspire 中集成 Azure Web PubSub基于 WebPubSub.AppHost 示例的代码优先实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考