Test result [PASSED]: 软解 + OpenGL ES + 在线HLS
Test result [PASSED]: 软解 + Vulkan + 在线HLS
Test result [PASSED]: 硬解直渲 + OpenGL ES + 在线HLS (实际软解回退)
Test result [PASSED]: 硬解直渲 + Vulkan + 在线HLS (实际软解回退)
...
全部 PASSED,问题修复完成。
关键数据
指标
传统模式(估算)
AI 自主闭环
人工介入次数
5~8 次
1 次(仅提出问题)
修复周期
2~4 小时
约 30 分钟
验证覆盖度
手动测试 1~2 种配置
自动覆盖 17 种配置
工作模式的转变
之前:开发者 = AI 的测试工程师
开发者提需求 → AI 写代码 → 开发者手动测试 → 开发者反馈结果 → AI 改代码 → 开发者再测 → ...
每一轮迭代都需要开发者:
等待编译完成
手动安装到设备
打开应用,导航到播放页面
点击播放,观察画面
将观察结果描述给 AI
现在:开发者 = 需求提出者
开发者提出需求/问题 → AI 自主完成全部工作 → 开发者确认结果
AI 自主完成的工作包括:
搜索代码库,理解现有架构
编写/修改代码,实现功能或修复问题
执行编译构建(./gradlew installDebug)
安装到设备(adb install)
触发自动测试(AutoTestActivity 自动运行)
收集测试日志(adb logcat)
分析结果,判断是否通过
如果失败,自动迭代修复
开发者只需要做一件事:描述需求或问题。
技术实现要点
自动化测试框架(AutoTestActivity)
核心设计:
应用启动时自动进入测试页面(MainActivity 作为启动 Activity,自动跳转)
测试用例以矩阵方式组织,自动遍历所有组合
每个用例独立运行:释放旧播放器 → 配置参数 → 播放 → 验证 → 记录结果
通过 Log.i(TAG, "Test result [PASSED/FAILED]: ...") 输出标准化日志
关键代码路径
背景
在 SkyPlayer 的开发过程中,AI 编程助手已经深度参与了代码编写、架构设计、问题排查等工作。然而,在之前的协作模式中,存在一个明显的效率瓶颈:
每次 AI 修改代码后,都需要开发者手动操作设备来验证结果。
开发者实际上充当了 AI 的"测试工程师"——点击播放按钮、观察画面、反馈结果。这种模式下,一个问题的修复往往需要 3~5 轮人工介入,严重拖慢了开发节奏。
实际效果截图:
核心思路:让 AI 拥有"眼睛"和"手"
要实现 AI 自主闭环开发,关键是补齐两个能力:
解决方案:自动化测试框架
我们在示例应用中新增了
AutoTestActivity,它是一个全自动的播放器功能验证页面:测试矩阵
总计 17 个测试用例(4×2×2 = 16 + 1 AI 字幕),全自动执行,无需任何人工操作。
HLS 智能验证策略
HLS 流的特殊性在于起播慢(需下载 m3u8 索引 + 首个 TS 分片),因此验证策略做了针对性优化:
实战案例:HLS 视频画面卡住问题的自主修复
这是一个完整的 AI 自主闭环修复案例,展示了从问题反馈到修复验证的全过程。
问题描述
用户反馈:
AI 自主排查过程
第一步:搜索代码库,定位相关模块
AI 自动搜索了视频渲染、解码、音画同步相关的代码模块,锁定了
ffplay.c中的视频刷新逻辑(video_refresh)和解码器初始化逻辑(stream_component_open)。第二步:添加诊断日志
AI 在关键路径上添加了诊断日志:
pictq(视频帧队列)的状态:是否为空、帧数量videoq(视频包队列)的状态:包数量pts值第三步:编译 → 安装 → 自动测试
# AI 自动执行 ./gradlew :app:installDebug adb shell am start -n imt.skymediaplayer.demo/.MainActivity # 等待自动测试完成 adb logcat -s AutoTestActivity | grep -E "PASS|FAIL"第四步:收集日志,分析根因
AI 从 logcat 中发现了关键线索:
HW_SURFACE 模式(硬解直渲):
pictq EMPTY count=301 videoq.nb_packets=26视频包队列有 26 个包,但帧队列始终为空——解码线程卡住了。
HW_BUFFER 模式(硬解 Buffer):
rendered pts=nan帧虽然入队了,但 pts 全是 NaN——时间戳丢失,音画同步失效。
第五步:定位根因
根因:Android MediaCodec 硬件解码器与 HLS 流的分片切换机制不兼容。
HLS 流的特点是由多个 TS 分片组成,播放过程中会频繁切换分片。每次切换时:
这导致了两种硬解模式都出现问题:
第六步:编写修复代码
AI 在
ffplay.c的stream_component_open函数中添加了 HLS 流检测和软解回退逻辑:// HLS 流检测:URL 包含 .m3u8 或格式名包含 hls/applehttp int is_hls = 0; if (is->filename && strstr(is->filename, ".m3u8")) { is_hls = 1; } else if (ic->iformat && ic->iformat->name && (strstr(ic->iformat->name, "hls") || strstr(ic->iformat->name, "applehttp"))) { is_hls = 1; } // HLS 流强制使用软解,避免硬件解码器兼容性问题 if (is_hls && decoder_mode != SKY_DECODER_MODE_SOFTWARE) { decoder_mode = SKY_DECODER_MODE_SOFTWARE; }第七步:编译 → 安装 → 自动验证
AI 再次执行编译安装,自动测试框架自动运行所有 17 个用例:
Test result [PASSED]: 软解 + OpenGL ES + 在线HLS Test result [PASSED]: 软解 + Vulkan + 在线HLS Test result [PASSED]: 硬解直渲 + OpenGL ES + 在线HLS (实际软解回退) Test result [PASSED]: 硬解直渲 + Vulkan + 在线HLS (实际软解回退) ...全部 PASSED,问题修复完成。
关键数据
工作模式的转变
之前:开发者 = AI 的测试工程师
每一轮迭代都需要开发者:
现在:开发者 = 需求提出者
AI 自主完成的工作包括:
./gradlew installDebug)adb install)AutoTestActivity自动运行)adb logcat)开发者只需要做一件事:描述需求或问题。
技术实现要点
自动化测试框架(AutoTestActivity)
核心设计:
MainActivity作为启动 Activity,自动跳转)Log.i(TAG, "Test result [PASSED/FAILED]: ...")输出标准化日志关键代码路径:
app/src/main/java/imt/skymediaplayer/demo/AutoTestActivity.ktapp/src/main/res/layout/activity_auto_test.xmlHLS 软解回退
核心设计:
stream_component_open中检测 HLS 流.m3u8或AVInputFormat.name包含hls/applehttpSKY_DECODER_MODE_SOFTWARE关键代码路径:
skymediaplayer/src/main/cpp/ffplay/ffplay.c(stream_component_open函数)AI Agent 的工具链
AI 通过以下工具链实现自主闭环:
codebase_searchread_filefile_replacelaunch-processread-process总结
通过引入自动化测试框架,我们实现了 AI 开发的关键闭环:
8 次降至 1 次,验证覆盖度从 12 种提升到 17 种这不仅是一个技术改进,更是一种 AI 辅助开发工作模式的升级——让 AI 真正具备了端到端的自主开发能力。