68 lines
4.2 KiB
Markdown
68 lines
4.2 KiB
Markdown
# Phase 2 Playback Lab 报告
|
||
|
||
日期:2026-08-29
|
||
分支:`harmony-port`
|
||
|
||
## 范围
|
||
|
||
`playback_lab/` 是独立 HarmonyOS 验证工程,仅链接 Phase 1 生成的 arm64 `libmpv.so.2`,不复用 Velix 主应用的页面或业务逻辑。当前只验证 GLES/EGL、软件解码和本地 MP4 首帧,不接入音频或硬解。
|
||
|
||
## 构建与产物
|
||
|
||
环境:DevEco Studio SDK API 24,HarmonyOS emulator 6.1.0.126,`aarch64-linux-ohos`。构建命令:
|
||
|
||
```sh
|
||
./scripts/stage-mpv.sh
|
||
DEVECO_SDK_HOME=/Applications/DevEco-Studio.app/Contents/sdk \
|
||
JAVA_HOME=/Applications/DevEco-Studio.app/Contents/jbr/Contents/Home \
|
||
PATH="$JAVA_HOME/bin:$PATH" \
|
||
/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw \
|
||
--no-daemon assembleHap --mode module -p product=default
|
||
```
|
||
|
||
结果:`BUILD SUCCESSFUL`。HAP:`playback_lab/entry/build/default/outputs/default/entry-default-unsigned.hap`,约 31 MiB,SHA-256 `877568c34a02a4d61b8c4ed7721dd2e6486cb675cd1a58a8eaf44c9b00de05f5`。包内包含 `libentry.so`、`libmpv.so.2` 和 `libc++_shared.so`;未提交 34 MiB 的 staged native 库。
|
||
|
||
构建仅保留两项预期警告:NAPI 动态模块在当前 SDK 尚未完成类型校验,以及调试 HAP 未配置正式签名;两者不影响本轮模拟器安装验证。
|
||
|
||
## 模拟器验证
|
||
|
||
目标:`127.0.0.1:5555`,虚拟设备进程配置为 Pura 90 Pro Max。
|
||
|
||
| 项目 | 结果 | 证据 |
|
||
| --- | --- | --- |
|
||
| HAP 安装、启动 | 通过 | `hdc install -r`、`aa start` 成功 |
|
||
| XComponent / OHNativeWindow | 通过 | 页面显示 `surface=READY`;Native 回调无崩溃 |
|
||
| EGLDisplay / EGLConfig / EGLContext / WindowSurface / makeCurrent | 通过 | 页面显示 `egl=READY`;日志 `EGL vendor=Express ... renderer=Mali-G77` |
|
||
| libmpv 初始化与 Render API | 通过 | 页面显示 `mpv=READY`;日志 `libmpv initialized` |
|
||
| 本地 H.264 MP4 软件解码 | 通过 | 本地 `sample.mp4` 首帧及持续播放成功 |
|
||
| Pause / Resume / Stop / Release | 通过 | UI 状态分别出现 `PAUSED`、`PLAYING`、`STOPPED`、`RELEASED` |
|
||
| Seek | 通过 | 有效播放中 `-10s/+10s` 不报错;跳转按 duration 做边界裁剪 |
|
||
| 释放后重新进入 | 通过 | `RELEASED` 后重新启动回到 `PLAYER_CREATED`,Surface/EGL/mpv 再次 READY |
|
||
| BigInt 状态序列化 | 通过 | `renderCount` 改为 Number,Inspector 不再出现 BigInt 序列化错误 |
|
||
|
||
一次本地播放快照:`position=2.00`、`duration=5.05`、`fps=29.97`、`dropped=0`、`firstFrameMs=622`、`renderCount=52`。另一轮快照首帧为 117 ms;`firstFrameMs` 从 `load()` 调用开始计时,并在第一次 `eglSwapBuffers` 后记录。
|
||
|
||
## First Frame Timeline
|
||
|
||
1. T0:XComponent 创建并取得回调传入的 `OHNativeWindow`,增加 NativeObject 引用。
|
||
2. T1:专用渲染线程创建 EGLDisplay、RGBA8 EGLConfig、ES3 EGLContext 和 EGLWindowSurface,执行 `eglMakeCurrent`。
|
||
3. T2:同一渲染线程创建 mpv OpenGL Render Context,注册 update callback。
|
||
4. T3:`loadfile` 完成本地文件打开,MPV 软件解码产生可渲染帧。
|
||
5. T4:渲染线程执行 `mpv_render_context_render`、`eglSwapBuffers`,记录 `firstFrameMs` 和 `renderCount`。
|
||
|
||
## 尚未完成的真机验收
|
||
|
||
本轮只有模拟器,没有接入 HarmonyOS 实体手机,因此 Phase 2 不能标记为最终 COMPLETE。以下项目保持待验证:实体机 HAP 安装、实体机本地 1080P H.264/AAC、HTTP MP4、HTTPS MP4、HLS、20 次 Surface recreate、20 次进出、50 次 Play/Pause、50 次 Seek、横竖屏 20 次、30 分钟稳定性、CPU/RAM 曲线。
|
||
|
||
## 风险状态
|
||
|
||
| 风险 | 当前状态 |
|
||
| --- | --- |
|
||
| RISK-01 POSIX / DNS / network runtime | 未验证,网络链路留待实体机 |
|
||
| RISK-02 XComponent / OHNativeWindow lifecycle | 模拟器已验证;实体机压力测试待做 |
|
||
| RISK-03 EGL context / Surface / plain-gl | 模拟器已验证;旋转与重建待做 |
|
||
| RISK-04 OHCodec buffer lifecycle | 保持开放;Phase 2 明确禁用硬解 |
|
||
| RISK-05 CA / HAP packaging | 未签名调试 HAP 安装通过;正式签名待接入 |
|
||
|
||
新增 MPV upstream patch:0;未修改第三方源码。进入 Phase 3(`ao_harmony + OHAudio`)的前置条件是实体机首帧、控制和压力矩阵完成。
|