原创代码采用 GPLv3(GPL-3.0-only)。Copyright (C) 2026 buhanzhe and contributors.
再分发应保留版权与许可说明、标明修改,并提供对应版本的完整对应源码;允许合规商用。
个人使用、作者权益和含私有子模块版本的源码义务见 版权与使用说明。
内测QQ群: 1121401707 (更快的bug响应和修复包)
nTv 是一款面向 Android 电视、电视盒子、平板和手机的横屏直播播放器,重点优化遥控器操作、老旧设备兼容性和央视直播稳定性。
- 内置央视网、央视频等直播频道,并支持多线路自动选择。
- 支持最高、适中、最低三档清晰度;只有一路时直接播放。
- 提供稳定、适中、低延迟三档直播模式。
- 使用 IJK 播放器,支持硬件解码、自动选择解码器和兼容软解。
- 支持自适应画面比例和全屏拉伸。
- 视频正常播完后显示“播放完成”和重播控制,切换主题使用相同播放器控件。当前视频已下载内容可通过磁盘缓存供重播复用,换台或退出时清除;缓存上限 512MiB,不预先下载整个视频。可用存储低于 400MiB、单次写入达到 250ms、连续写入低于约 1MiB/s、写入积压或磁盘错误时停止缓存,播放继续走网络。
- 支持遥控器、触摸屏、网页遥控器和手机飞鼠。
- 支持多标签网页、收藏栏、广告拦截和多个命名用户脚本。
- 网页标签栏右上角可开启遮罩,隐藏网页画面并显示网址和加载状态;点击“显示网页”或按返回键恢复,网页与视频解析继续运行。
- 网页管理 → 浏览器配置普通32位、64位和x86包使用系统 WebView;仅32位
ntv_bro浏览器版携带轻量内核,可切换系统 WebView。浏览器版在 Android 5.0 以下默认轻量内核,5.0 及以上默认 WebView;保留用户已保存的选择。轻量内核的 DOM 和首次 UJS 就绪后 10 秒仍未嗅探到媒体时,在同一页面开启最高 1fps 绘制,不重载、不重复执行 UJS;后续发现媒体继续交给原生播放器。 - 网页遮罩默认关闭,支持加载信息和纯黑样式。遮罩仅覆盖画面,不改变 WebView 可见性、暂停状态或网络/脚本生命周期,也不主动抢走网页焦点。纯黑遮罩点击画面或按确定、返回可显示网页,兼容旧版独立网页进程。
- 主题右侧菜单 → 网页配置可用遥控器选择分辨率、网页遮罩、极简模式、浏览器 UA、版本标识、网页缩放、网页内核、加载图片和嗅探播放。与网页管理共用设置和保存接口,遮罩三档一次保存,返回恢复父菜单位置。
- 支持接收投屏、接管会话、遥控回传及独立鼠标指针渲染。
- 支持 M3U、M3U8、TXT 在线频道列表。
- 可显示时间、日期、网速和播放调试信息。“播放与显示 → 显示播放进度”默认关闭,开启后在右上角显示播放位置与总时长,与时间并排;直播和纯音频不显示。网速固定在右下角,调试信息避让并可换行,网址的查询参数省略。
- 支持开机自启动、在线更新和异常自动恢复。
- 最低支持 Android 4.0。
本仓库保留播放器、浏览器、网页管理及投屏接收端。投屏发送端的画面采集、编码、RTSP 推流、后台采集服务和发送入口不在公开版中;完整发送端继续由独立私有项目维护。
公开版仍兼容接收协议与独立光标通道。拆分边界和验证方式见 接收端说明。
下载 APK 后直接安装即可。升级时建议直接覆盖安装,以保留频道和偏好设置。
Android 8.0 及以上系统如果阻止安装,请根据系统提示,允许当前浏览器或文件管理器“安装未知应用”。
- 上键、下键:切换频道。
- 确认键、菜单键:打开频道列表。
- 返回键、菜单键:关闭频道列表。
- 播放/暂停键:暂停或继续播放。
- 数字键:按频道序号快速切台。
- 频道列表关闭时连续按两次返回键:退出应用。
如果习惯相反的切台方向,可在设置中开启“上下键反转”。
- 点击画面左侧:打开频道列表。
- 点击画面右侧:打开功能设置,默认界面打开网页管理。
- 点击点播画面中间:显示播放控制器。
- 直播画面:全屏左右滑动切换线路,左侧上下滑动调节亮度,右侧上下滑动切换频道。
- 点播画面:左侧上下滑动调节亮度,右侧上下滑动调节音量,左右滑动预览进度,松手后跳转;取消滑动不跳转。控制器隐藏时同样可用。
- 六套界面的分组、频道、节目单共用遥控器分页:本页末项按下进入下一页首项,首项按上返回上一页末项,列表两端停留。浏览不自动播放,OK 确认;记住各分组与节目单位置,EPG 刷新按节目时间保留选择。触摸保持自然滚动,返回遥控器后从可见条目接续。
平板或手机旋转后,视频画面会跟随设备方向调整。
电视与手机连接到同一个局域网后,可在应用菜单中查看网页管理地址或二维码。
网页管理端可以:
- 选择频道和线路。
- 调整清晰度、直播稳定性和画面比例。
- 设置时间、日期、网速及调试信息。
- 添加或更新在线频道列表。
- 配置开机自启动和遥控器行为。
管理端口从 9966 开始;如果端口被占用,应用会自动尝试下一个端口。请以应用实际显示的地址为准。
自定义分组名称末尾使用 _数字密码,例如:
测试频道_10086,#genre#
测试一台,http://your-server/channel1.m3u8
高清秒播_0709,#genre#
高清台,http://your-server/channel2.m3u8
在管理网页“偏好设置 → 分组输入密码”中开启校验,默认关闭。电视端不显示此开关。
频道列表只显示“测试频道”“高清秒播”。遥控器进入频道列、点击播放或数字选台时验证密码;也可以通过方向键操作弹窗数字键盘。数字键输入达到密码位数后自动验证,确认键也可以提交,删除键退格,返回键取消。0709 必须保留开头的 0。
同一分组本次进入只需验证一次,切台和重试沿用本次解锁;浏览其他分组后再进入需要重新验证。解锁状态不写入配置,重新启动后仍需输入。收藏和节目回看入口也保留原分组校验。弹窗配色、文字和选中效果跟随当前主题。
M3U 的 group-title="名称_数字密码" 使用相同规则;原始分组名称保留在频道源和缓存中。
导入带回看声明的 M3U 后,在“频道列表 → 节目单”中选择标有“回看”的历史节目即可播放;遥控器 OK 和触屏点击均支持。播放器右上角“回到直播”或关闭浮层后按返回键,可返回当前频道直播。直接选择其他频道也会回到直播。
支持常见 M3U catchup 的 default(完整地址)、append(附加参数)、shift/旧 timeshift(SIPTV)、flussonic/fs、xc/xtream-codes 模式。识别 catchup-source、catchup-days、catchup-correction,并保留每条线路各自的配置。目录头部的默认属性可由频道条目覆盖。
#EXTM3U
#EXTINF:-1 tvg-id="cctv1" group-title="直播" catchup="append" catchup-days="7" catchup-source="?playseek={utc:YmdHMS}-{utcend:YmdHMS}",CCTV-1
http://your-iptv-server/channel/index.m3u8未声明回看模板(或 default/append 未填写模板)的 HTTP/HTTPS HLS、TS 和 PLTV/TVOD 频道,可在历史节目上选择“尝试回看”:默认尝试最近 7 天,保留原鉴权参数,追加 playseek=yyyyMMddHHmmss-yyyyMMddHHmmss;明确的 /live/用户/密码/频道.ts 或 .m3u8 路径采用 Xtream 回看路径。若声明了 catchup-days 或时区修正,则沿用该值。显式模板优先,catchup="none" / catchup-days="0" 会关闭自动拼接。旧缓存无需重新导入,推断结果只作内存缓存,不增加直播请求。自动拼接只是尝试,仍需要服务商提供历史录像,部分服务端可能忽略回看参数而继续返回直播。
这是格式示例,请使用服务商实际提供的回看模板。支持 {utc}、{utcend}、{lutc}、{duration}、{duration:60}、{offset:60}、{Y}{m}{d}{H}{M}{S} 和 ${start}/${end} 等常用占位符,以及 XMLTV 节目的 {catchup-id};同时支持 DIYP 风格的 ${(b)yyyyMMddHHmmss} / ${(e)yyyyMMddHHmmss}(分别为节目开始、结束时间,Java 日期格式)。时间戳为 Unix 秒;日期格式按设备时区,catchup-correction 单位为小时。
节目单地址需在网页管理中配置,XMLTV 本身必须包含历史节目。按源声明的期限显示可回看节目(最多 30 天);节目未开始、过期、服务器未提供回看时会提示。回看切换线路或重试会保留节目,不会悄悄改播直播。普通直播不增加前置探测和下载请求。
在网页管理端进入“手机飞鼠”,开启电视光标后即可使用:
- 陀螺仪:像遥控器一样移动或转动手机来控制光标。
- 触控板:滑动控制光标,滑动越快移动越快。
- 点击、返回和光标居中等快捷按钮。
首次启用陀螺仪时,请允许浏览器访问动作与方向传感器。使用完毕后可再次点击按钮关闭陀螺仪,以降低手机耗电和发热。
- 直播稳定性:优先选择“稳定”。
- 清晰度:网络和设备性能允许时选择“最高”。
- 画面比例:优先选择“自适应”。
- 解码方式:优先使用自动硬解;出现黑屏或花屏时尝试兼容软解。
优先使用“稳定”直播模式,或降低清晰度。应用会等待必要分片准备完成后再开始播放。
确认电视和手机连接到同一个局域网,并使用应用当前显示的 IP 和端口。部分路由器的访客网络会禁止设备互相访问。
使用系统浏览器打开飞鼠页面,并允许动作与方向权限。部分浏览器需要安全网页环境才能提供传感器数据。
先尝试自动选择解码器;仍无法播放时切换到兼容软解。不同电视芯片和系统固件的解码兼容性可能不同。
双击项目根目录的 build-release.bat,即可调用 scripts/build-release.ps1,生成 ARM32、ARM64、x86 普通正式包及仅 ARM32 的浏览器版,并更新版本文件。打包结束后窗口会保留,方便查看成功信息或错误原因。
默认输出为 output/nTv.apk(32 位)、output/nTv64.apk(64 位)和 output/nTvX86.apk(x86),同时复制生成 nTv-v7a-电视盒子专用-v<版本号>.apk、nTv-v8a-手机或高版本设备-v<版本号>.apk、nTv-x86-模拟器专用-v<版本号>.apk(版本号从实际 APK 自动读取);英文名与对应中文名文件内容完全一致。普通三包均不携带轻量内核。额外输出 ntv_bro.apk,中文名为 nTv-bro-v7a-电视盒子专用-含轻量内核-v<版本号>.apk,仅含 ARM32 轻量内核;该版本使用独立升级附件与校验值,四包 mapping 一起收入 mapping.zip。 四种正式包均不携带 libh5estream.so,央视网使用整段解密回退路径。更新清单使用英文名 GitHub Release 附件,上传时保留大小写,兼容已发布客户端。需要先配置 Android SDK(local.properties)和正式签名(.signing),无需管理员权限。
默认采用增量构建,避免 Windows 文件占用导致 :app:clean 失败;需要完整清理时可执行 build-release.bat -Clean。命令行也可继续传递 -SkipClean 等原脚本参数。
构建使用 JDK 17、Gradle 8.11.1 和 Android Gradle Plugin 8.9.1,需要安装 Android SDK Platform 34、Build Tools 35.0.0;应用最低系统版本与 targetSdk 保持不变。正式包启用 R8 代码优化、混淆和资源裁剪,旧系统的电视横幅只生成一张 PNG 兼容图。打包时在 APK 旁导出一个 output/mapping.zip,内含 arm32/mapping.txt、arm64/mapping.txt、x86/mapping.txt 及记录 APK、映射 SHA256 的 manifest.json。每个 APK 的映射仍按哈希归档为 output/mapping/<APK 的 SHA256>/mapping.txt,保留历史版本。映射缺失或为空时打包会报错;发布时请保留对应 ZIP,用于还原该版本的崩溃堆栈。
日常打包只在输出目录生成 version-lite.json,设备信息页优先使用它检查应用版本;若返回 HTTP 404,则读取同一发布目录的 version.json,兼容未提供轻量清单的旧版本。其他网络错误保留失败提示。只有解码器等重要更新才使用 build-release.bat -ImportantUpdate,额外生成启动检查使用的 version.json 和兼容旧版的 version-iptv.json。
请仅播放您有权访问的直播内容。频道可用性、清晰度和线路数量可能随上游服务变化。
浏览器 Java/JS、litehtml、WASM、浏览器专用 QuickJS/TLS 代码保存在单独授权的私有工程中,不随本仓库提交。本仓库仅在 prebuilt/litebrowser/<ABI>/libntvLitebro.so 保存轻量内核的二进制快照,不包含内核源码或子模块入口。
构建仍使用 :litecore 和 :litebrowser Gradle 任务,需要将单独取得授权的内核工程放到本地 browser-core/ 目录,再执行:
./gradlew.bat :app:assembleArm64Debug --console=plainbrowser-core/ 已被 Git 忽略。公开的 .so 不包含构建所需的 Java 接口和 JS 资源,不能单独替代该本地依赖;当前公开检出仍需要上述授权依赖才能构建。应用业务代码和通用 QuickJS/TLS 库仍在本仓库维护。分发包含内核的 bro 安装包时,完整对应源码的提供义务见 版权说明,仅提交 .so 不代表已满足该义务。