Files
jiecheng-business/5.1声道接入成果总结.md
freeboss b7b5518834 feat: dev-5.1 分支基线(v1.3.35 发版后代码 + 5.1 声道改造文档)
- 以 main(ccc65af) 为基线提交当前工作区代码
- 新增 5.1 声道改造文档两份
- .gitignore 补充 .vscode/、.screenshots/
2026-11-02 19:25:12 +08:00

147 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 捷成 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 档位) |