uTV 是一款专为 北京联通 IPTV 打造的 Android / Android TV 高性能直播播放器应用。项目基于 bilibili/ijkplayer 播放器内核深度定制,并完整集成 wuwentao/bj-unicom-iptv 的节目源规范与巡检能力,支持 4K 超高清(HEVC 50fps)、高清及标清全频道流畅播放、秒级切台以及局域网组播地址动态扫描。
- 内置双版本节目源:内置最新可用频道表(
bj-unicom-iptv.m3u)及包含历史频道的 215 个全量频道表(bj-unicom-iptv-all.m3u),可在设置中随时切换。 - 多维频道分组:支持
全部频道、[高清]央视、[高清]卫视、[高清]北京、[高清]北京IPTV、4K超清、少儿、标清频道、动态扫描发现、收藏频道分类浏览。 - 快速检索与过滤:支持按频道名称、台号、组播 IP 搜索,支持一键开启「仅显示可用频道」及频道收藏持久化。
- 路由器
udpxy组播转单播(推荐):自动将rtp://239.3.1.x:port转换为http://<udpxy_ip:port>/rtp/239.3.1.x:port(默认192.168.2.1:8012)。 - 内置本地
udpxy代理网关(LocalMulticastProxyServer):当路由器未安装udpxy、或光猫 IPTV 口直连电视盒子时,应用在本地自动监听127.0.0.1代理端口,自动探测并绑定 IPTV 专网网卡(如无默认网关的eth0),加入 IGMP 组播组并剥离 12 字节 RTP 协议头(含 CSRC 与扩展头),向播放器实时推送纯净的 MPEG-TS 流。 - 原生 RTP/UDP 组播直连模式:直接通过本地组播引擎加入网卡 IGMP 组播组解封装播放。
- 智能故障回退:当外部
udpxy代理不可达时,自动无缝回退至内置本地组播网关并在当前会话中记忆状态,避免后续切台重复等待超时。
- 流下载与解码器池化复用(
StreamDownloaderPool+CodecDecoderPool):- 将流媒体网络接收、MPEG-TS 协议解析(
PAT->PMT->ES Header)与音视频解码器解耦并池化管理,切台时异步回收与复用解码器实例,主线程零阻塞。
- 将流媒体网络接收、MPEG-TS 协议解析(
- 关键帧对齐与零慢放秒开:
- 针对直播流切入 GOP 中间导致首个视频 IDR 帧晚于音频帧、进而引发切台前几秒
0.5x慢放的问题,下载器在首个视频 IDR 关键帧到达前自动过滤非关键帧视频包及早到的旧音频包,严格对齐PAT + PMT + 首个视频 IDR 关键帧 + 同 PTS 音频帧,实现音画同步秒开。
- 针对直播流切入 GOP 中间导致首个视频 IDR 帧晚于音频帧、进而引发切台前几秒
- 全格式音频解码支持:
- 原生 MP2 音频支持:内置多架构(
arm64-v8a、armeabi-v7a、x86、x86_64)定制版libijkffmpeg.so,原生开启广电 IPTV 标配的MP2 (MPEG-1 Audio Layer II)解码器。 - 杜比 AC-3 / E-AC-3 硬件伴音协同(
TsHardwareAudioCompanion):针对 CCTV-4K、北京卫视 4K 等采用杜比AC-3/E-AC-3音轨的频道,通过零重复连接的 TS 旁路分发机制驱动 Android TV 硬件MediaCodec+AudioTrack(含 HDMI 直通回退)同步输出伴音。
- 原生 MP2 音频支持:内置多架构(
- 多播放内核与渲染切换:支持
IjkMediaPlayer、AndroidMediaPlayer切换,支持硬解(MediaCodec H.264 / HEVC)开关、SurfaceView/TextureView渲染视图切换,以及 6 种画面比例(适应屏幕、铺满裁剪、原始尺寸、拉伸全屏、16:9、4:3)调节。
内置可视化组播扫描与频道巡检工具(ScannerActivity / MulticastScannerEngine),提供三种运行模式:
- 巡检内置频道表:逐频道探测连通性、实测延迟、视频编码/分辨率/帧率(如
#1 hevc, 3840x2160,50fps)及音频轨道参数(如#1 mp2,2ch,48khz),自动比对频道名中的分辨率标识与实际分辨率是否一致。 - 组播网段动态扫描:支持自定义网段(默认
239.3.1.1 ~ 239.3.1.254)及高频端口快速扫描 / 79 个联通已知端口全量扫描,自动发现新上线的组播频道并归入「动态扫描发现」分组。 - 原生执行
check_iptv_m3u.sh脚本引擎:在支持 Shell 工具链的环境中直接释放并运行增强版check_iptv_m3u.sh。 - 标准化导出:扫描完成后自动合并更新应用频道表,并支持一键导出带 UTF-8 BOM 的
results.csv巡检报告与modified_iptv.m3u播放列表。
采用沉浸式 Material Design 3 暗色毛玻璃 HUD 设计,同时适配 Android TV 大屏与触屏设备:
| 交互方式 | 操作说明 |
|---|---|
| 电视遥控器 | • 上下方向键 / 频道加减键:全屏状态下快速换台 • 0-9 数字键:数字选台(右上角实时预览匹配频道名,按 OK 立即确认或超时自动跳转)• 左/右方向键(全屏播放时):呼出左侧频道列表并自动定位到当前播放频道 • OK 键(全屏播放时):呼出顶部与底部信息页面(OSD 控制栏) • 左右方向键(抽屉打开时):在频道分类之间快速切换 • 长按 OK 键 / 红键 ( PROG_RED):打开快捷操作面板 / 收藏当前频道• 绿键 ( PROG_GREEN):打开「组播地址动态扫描与巡检」界面• 黄键 ( PROG_YELLOW):循环切换画面比例• 菜单键 ( MENU) / 蓝键 (PROG_BLUE):打开快捷操作面板 / 播放器与 udpxy 网络设置• 返回键 ( BACK):关闭抽屉或信息页面,全屏状态下双击返回退出应用 |
| 手机 / 平板触屏 | • 单击屏幕:显示/隐藏顶部与底部 OSD 控制栏,或收起频道抽屉 • 双击屏幕:快速切换画面比例 • 屏幕左侧向右滑动:呼出频道列表抽屉 • 向左滑动:收起频道列表抽屉 • 全屏上下滑动:快速切换上/下一频道 • OSD 虚拟数字键盘:触屏点击选台按钮即可呼出 0-9 虚拟数字键选台 |
app/src/main/
├── assets/
│ ├── bj-unicom-iptv.m3u # 内置北京联通 IPTV 最新精简频道列表
│ ├── bj-unicom-iptv-all.m3u # 内置北京联通 IPTV 215 个全量频道列表(含历史频道)
│ └── check_iptv_m3u.sh # 增强版节目源巡检与组播网段动态扫描脚本
├── java/com/bjunicom/iptv/
│ ├── IptvApplication.java # 应用入口:初始化 ijkplayer、持有 MulticastLock、启动本地组播代理
│ ├── config/
│ │ └── IptvSettings.java # 播放模式、udpxy 地址、解码器与扫描参数持久化配置
│ ├── model/
│ │ └── IptvChannel.java # 频道数据模型(含台号、分组、音视频轨道信息、连通状态)
│ ├── network/
│ │ ├── LocalMulticastProxyServer.java # Android 本地 IGMP 组播转 HTTP-TS 代理网关
│ │ └── StreamUrlResolver.java # 组播 URL 与 udpxy / 本地代理地址解析转换器
│ ├── parser/
│ │ └── M3uParser.java # M3U 播放列表解析与导出工具
│ ├── player/
│ │ ├── IjkVideoView.java # 定制播放器核心视图与音视频轨道探测
│ │ ├── StreamDownloaderPool.java # 池化流媒体下载器(PAT/PMT 解析与 IDR 关键帧对齐)
│ │ ├── CodecDecoderPool.java # IjkMediaPlayer 与硬件伴音解码器对象池
│ │ ├── TsHardwareAudioCompanion.java # Android TV 杜比 AC-3/E-AC-3 硬件音频伴音引擎
│ │ └── TsCodecDescriptor.java # MPEG-TS 实时编解码器规格描述符
│ ├── repository/
│ │ └── ChannelRepository.java # 频道仓库、分类过滤、搜索与扫描结果合并
│ ├── scanner/
│ │ ├── MulticastScannerEngine.java # 组播动态扫描与 check_iptv_m3u.sh 巡检引擎
│ │ └── ScanStatistics.java # 巡检实时统计数据模型
│ └── ui/
│ ├── MainActivity.java # 主播放界面(OSD、频道抽屉、遥控器与触屏交互)
│ └── ScannerActivity.java # 组播动态扫描与节目源巡检界面
└── jniLibs/ # 支持 MP2 解码的多架构 ijkplayer / FFmpeg 原生库
- JDK:Java 8 或更高版本(推荐 JDK 17)
- Android SDK:
compileSdk 34,minSdk 21(支持 Android 5.0 ~ Android 14 的电视、机顶盒、手机及平板)
# 编译 Debug 安装包
./gradlew assembleDebug
# 编译 Release 签名安装包
./gradlew assembleRelease
# 运行单元测试
./gradlew testDebugUnitTest生成的 APK 位于 app/build/outputs/apk/ 目录下,可通过 adb install 安装至电视盒子或手机。
本项目的开发基于以下两个优秀的开源项目,特此向原作者及社区贡献者致以诚挚感谢:
-
- 感谢 Bilibili 开源的基于 FFmpeg 的跨平台音视频播放器内核。
ijkplayer提供了扎实稳定的 Android 音视频解码、渲染框架与高度可扩展的IMediaDataSource接口,为本项目实现 MPEG-TS 直播流秒级切台、多架构硬解/软解协同以及 4K 超高清流畅播放奠定了核心基础。
- 感谢 Bilibili 开源的基于 FFmpeg 的跨平台音视频播放器内核。
-
- 感谢
@wuwentao整理并持续维护的北京联通 IPTV 组播频道列表(bj-unicom-iptv.m3u)、网络拓扑配置指南以及check_iptv_m3u.sh自动化节目源巡检脚本。本项目的内置频道数据源、分组规范、轨道探测格式以及组播巡检导出逻辑均源自该项目的宝贵成果。
- 感谢