147 lines
8.2 KiB
Markdown
147 lines
8.2 KiB
Markdown
|
|
# 捷成 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 档位) |
|