feat: dev-5.1 分支基线(v1.3.35 发版后代码 + 5.1 声道改造文档)

- 以 main(ccc65af) 为基线提交当前工作区代码
- 新增 5.1 声道改造文档两份
- .gitignore 补充 .vscode/、.screenshots/
This commit is contained in:
freeboss
2026-11-02 19:25:12 +08:00
parent ccc65afcbc
commit b7b5518834
1394 changed files with 13694 additions and 3710 deletions

View File

@@ -0,0 +1,146 @@
# 捷成 Android TV — 5.1 环绕声道接入成果总结
> 版本基线:v1.3.33(aishiRemoteRelease)|验证设备:Amlogic Android 14 盒子(172.16.100.175,曾用 184)
> 验证结论:**AC3 5.1 比特流经 HDMI 直通输出成功,解码器面板显示 AC3**
---
## 一、目标与结果
| 目标 | 结果 |
|---|---|
| 接入橘视厅 5.1 环绕声业务渠道,拉取 5.1 片库内容 | 完成 |
| 播放器识别并优先播放 5.1 声道片源 | 完成 |
| 5.1 音频经 HDMI 输出到外接解码器/功放 | 完成(AC3 源码直通,非 LPCM 下混) |
全链路形态:
```
EPG 点播 → SDK 鉴权(getVideoUrls) → 识别"1080P 5.1 环绕声"独立档
→ H265(硬解) + AC3(平台直通/FFmpeg 软解兜底)
→ HDMI 输出:直通设备=AC3 bitstream(RAW_DIRECT);非直通设备=6ch LPCM(FFmpeg 软解)
```
## 二、渠道参数(橘视厅5.1环绕声业务)
| 参数 | 值 |
|---|---|
| tenant | huashitv |
| accesser | JSTAS51 |
| secret | oam25ZqvGy3gVY0x |
| agcode | 1100101010200492358120169 |
| comboCode(业务组合) | 1100121044377892530980001 |
| serviceGroupCode | 1100122010201752209710182 |
| businessLine(业务线) | 4100450044057893707260002 |
| productCode(产品包) | 2100130010166202685000333 |
| 免登录公钥 | debug/release 共用同一把(见 ChannelManger) |
## 三、App 端代码改动
### 3.1 渠道参数全局替换(运行时 + 默认值三处同步)
- [ChannelManger.java L63-L73](app/src/main/java/com/pukka/jiecheng/utils/ChannelManger.java#L63-L73):`initChannel()` 运行时唯一生效入口(MainActivity.onCreate 调用),ACCESSER/SECRET/业务组合/业务线/公钥全部替换为 5.1 业务参数
- [BaseConst.java L18-L24](libcore/src/main/java/com/pukka/libcore/base/BaseConst.java#L18-L24):四个码的静态默认值同步(MyApplication 阶段请求使用)
- [JetsenxSdkUtil.java L36-L39](app/src/main/java/com/pukka/jiecheng/utils/JetsenxSdkUtil.java#L36-L39):AGCODE/ACCESSER/SECRET 默认值同步
### 3.2 产品包直连(跳过动态取包)
[JetsenxSdkUtil.java L49-L53](app/src/main/java/com/pukka/jiecheng/utils/JetsenxSdkUtil.java#L49-L53):`productCodeSp` 直接初始化为官方产品包 `2100130010166202685000333`,跳过 `getAllAssetPrices` 动态取包(避免多产品包场景取错包导致 -110 未订购)。
### 3.3 5.1 片源自动优先(核心逻辑)
[JetsenxSdkUtil.java](app/src/main/java/com/pukka/jiecheng/utils/JetsenxSdkUtil.java) 的 `getVideoUrls2()`(L785-L804)和 `getFreeVideoUrls2()`(L850-L869)两处,在 720/1080 解析循环后追加 5.1 覆盖块:
```java
// 5.1 环绕声独立档(format='1080P 5.1 环绕声',H265+AC3_51):自动优先策略下作为 1080 档播放地址。
// Android 5.1(API 22)及以下解码能力有限,跳过 5.1 流,保留普通 1080P。
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
for (VideoInfo info : videoInfos) {
String fmt = info.getFormat() == null ? "" : info.getFormat();
if (fmt.contains("5.1") || fmt.contains("环绕声")) {
videoUrl_1080 = info.getVideoUrl();
// PlayCodeBean 同步 movieCode/programCode/specCode → 播放记录上报正确
...
break;
}
}
}
```
设计要点:
- **最小侵入**:复用现有 1080 档通道,档位管理(VideoDetailStatusManager)/播放调用点零改动
- 5.1 流的 movieCode/programCode/specCode 同步写入 PlayRecordManager,上报与播控正确
- API 22 及以下自动降级普通 1080P(无软解能力兜底)
### 3.4 播放器渲染器策略:PREFER → ON(关键决策)
[PkExoMediaPlayer.java L110](mediaplayertv/src/main/java/com/pukka/videoplayertv/exoplayer/PkExoMediaPlayer.java#L110):
```java
// v1.3.32: EXTENSION_RENDERER_MODE_PREFER → FFmpeg 渲染器全量优先(含视频)
// v1.3.33: EXTENSION_RENDERER_MODE_ON → 平台渲染器优先,FFmpeg 仅兜底
```
原因:
1. **直通需求**:`PREFER` 下 FFmpeg 音频渲染器优先抢走 AC3 → 永远软解为 PCM,AudioTrack 永远不会以 `ENCODING_AC3` 输出,HDMI 源码直通不可达
2. **`ON` 的行为**:平台 MediaCodec 渲染器优先。设备开编码环绕声(ALWAYS)时 ExoPlayer 检测到 AC3 输出能力 → 直通;未开启/不支持时走平台解码或回落 FFmpeg 软解
3. **额外收益**:H265 视频从 FFmpeg 软解回到平台硬解
### 3.5 FFmpeg 扩展依赖(软解兜底)
[app/build.gradle L314-L318](app/build.gradle#L314-L318):`exoplayer-ffmpeg-extension-2.19.1.aar`(定制编译,含 AC3/EAC3/DCA/TrueHD 解码器,官方默认版不含)。用于不支持直通的设备软解 AC3 → 6ch LPCM 输出。
### 3.6 其他
- versionName → v1.3.33;签名路径改为相对路径 `key/jiecheng.jks`
- 打包命令:`sh ./gradlew assembleAishiRemoteRelease`(遥控版)/ `assembleAishiTouchRelease`(触屏版)
## 四、5.1 片源数据形态
- **独立 URL 档位**(非同流多音轨):同一影片多档清晰度中有一档 `format='1080P 5.1 环绕声'`
- 该档位:H265 视频 + AC3 5.1(AC3_51)音频
- **EPG/SDK 均无 5.1 元数据字段**,唯一标识是 `VideoInfo.format` 字符串 → UI 角标需依赖此字段(待捷成侧加字段可优化)
## 五、真机验证结论(Amlogic Android 14)
| 版本 | 渲染策略 | audio_flinger 实测 | 效果 |
|---|---|---|---|
| v1.3.32 | FFmpeg PREFER | `HAL: PCM_16_BIT, 6ch, usecase: PCM_DIRECT` | 软解 6ch LPCM 输出 HDMI,有声 |
| v1.3.33 | 平台优先 ON | `HAL: AUDIO_FORMAT_AC3, usecase: RAW_DIRECT, DIRECT 线程` | **AC3 比特流直通,面板显示 AC3** |
验证命令:`adb shell dumpsys media.audio_flinger`,关注 DIRECT 输出线程的 `HAL format` 与 `usecase`。
## 六、系统侧音频配置要点(测试设备部署须知)
AC3 直通需系统侧两项配置(设备 root 后操作):
```bash
# 1. 开启编码环绕声输出(Amlogic 固件实测:2 是陷阱值,正确部署值 0/3,见下方链路关系)
adb shell settings put global encoded_surround_output 0
# 生效标志:dumpsys media.audio_flinger | grep digital_audio_mode → AUTO
# 2. 重启 App(ExoPlayer 在播放器实例化时读取系统音频能力)
```
链路关系(Amlogic 固件实测修正):
- **部署用 `0 (AUTO)` 或 `3 (MANUAL)`** → HAL `digital_audio_mode` 为 **AUTO** → AC3 流走 IEC RAW 直通
- `encoded_surround_output=1 (NEVER)` → HAL 被下发 **PCM** 模式 → 直通不可用(App 注入条件已排除 NEVER,安全回落软解 2.0,不无声)
- **`encoded_surround_output=2 (ALWAYS)` 在该 Amlogic 固件是陷阱值**:policy 照常向 App 上报 AC3 能力,但 HAL 被 SettingsObserver 切到 PCM,两层矛盾表现为无声/静默回退。本文档早前"`put ... 2`"的建议**作废**,详见《5.1声道改造-代码变更清单与复用指南.md》§2.3
设备伪装(换机测试不重新开通):root 写 `shared_prefs/config.xml` 的 `ETH_MAC` 键 → App 用伪装 MAC 请求沿用 uid/订购。
## 七、遗留问题与后续规划
### 7.1 已知问题
1. **开机重置**:设备重启后有系统组件将 `encoded_surround_output` 改回 1(NEVER),导致 HAL 变 PCM、直通失效,需重新设置并重启 App。待排查改写来源(疑似 Amlogic 设置应用/固件默认逻辑),部署设备需固化该配置
2. **生效时序**:运行时改 `encoded_surround_output` 后,HAL 的 `digital_audio_mode` 由 audio policy 在下次输出重配置时才下发 AUTO(实测延迟数分钟/需触发),改完设置应重启 App 并重新进播放
### 7.2 后续待办
| # | 事项 | 说明 |
|---|---|---|
| 1 | **设备能力检测** | App 启动/播放前检测:AC3 直通能力(AudioCapabilities/编码环绕声设置)+ 解码能力,动态决策 直通/软解/降级,并可在 UI 提示当前音频输出模式 |
| 2 | **5.1 解码开关按钮** | 设置项或播放页开关:开启=优先 5.1 档,关闭=普通 1080P(给无环绕设备的用户退出手段) |
| 3 | **5.1 节目标识** | 详情页/海报角标"5.1",基于 `VideoInfo.format` 含 "5.1"/"环绕声" 判断;EPG 无字段,可推动捷成侧补元数据 |
| 4 | 清晰度菜单区分 | 档位名显示"1080P 环绕声"替代直接替换 1080 档(当前 5.1 档覆盖 1080 档位) |