# DLPlayer **Repository Path**: DragonCodingPlus/dlplayer ## Basic Information - **Project Name**: DLPlayer - **Description**: rtmp 流播放器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-24 - **Last Updated**: 2026-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DLPlayer **DLPlayer** 是一款 Android 直播流播放器,基于 Jetpack Compose 和 ExoPlayer (Media3) 构建。它使用自定义的 JNI RTMP 数据源替代官方的 `media3-datasource-rtmp` 库,通过内嵌并打过 IPv6 补丁的 RTMPDump librtmp,实现对 RTMP 流的 IPv6 支持。 ## 功能 - **RTMP 直播播放** — 通过自定义原生 RTMP 客户端播放 IPv4 和 IPv6 的 RTMP 流 - **流管理** — 使用本地 Room 数据库添加、查看和删除直播流 - **自动重连** — 连接断开时自动重连 - **视频信息显示** — 实时显示分辨率和源 IP 地址 - **静音切换** — 快速开关音量 - **多 ABI 支持** — 编译 arm64-v8a、armeabi-v7a、x86_64、x86 - **IPv6 支持** — 完整支持 IPv6 RTMP URL(如 `rtmp://[::1]/live/stream`) - **自定义原生 RTMP** — 通过 JNI 桥接内嵌的 librtmp,绕过官方库的 IPv4 限制 ## 环境要求 - Android Studio Hedgehog (2024.1.1) 或更高版本 - JDK 17+ - Android SDK 36 - Android NDK 26.3.11579264 - CMake 3.22.1+ ## 构建与运行 ```bash # 克隆仓库 git clone cd DLPlayer # 编译 debug APK ./gradlew assembleDebug # 编译 release APK(需要 local.properties 中的签名配置) ./gradlew assembleRelease # 安装到已连接的设备 ./gradlew installDebug ``` Debug APK 输出在 `app/build/outputs/apk/debug/app-debug.apk`。 ## 技术栈 | 组件 | 版本 | |------|------| | Kotlin | 2.2.10 | | Android Gradle Plugin | 9.2.1 | | compileSdk / targetSdk | 36 | | minSdk | 24 | | Jetpack Compose | BOM 2026.02.01 | | Material3 | — | | Media3 (ExoPlayer) | 1.10.1 | | Room | 2.7.1 | | Navigation Compose | 2.8.9 | | NDK | 26.3.11579264 | | CMake | 3.22.1 | | RTMPDump (librtmp) | 2.4(内嵌,IPv6 补丁版) | ## 架构 应用采用标准的 Android 架构:Jetpack Compose 做 UI,Room 做本地持久化,自定义原生层做 RTMP 流处理。 ``` ┌──────────────────────────────────────────┐ │ UI 层 (Jetpack Compose) │ │ ├─ StreamListScreen (流管理) │ │ ├─ PlayerScreen (视频播放) │ │ └─ AboutScreen (关于) │ ├──────────────────────────────────────────┤ │ 媒体层 │ │ ├─ RtmpDataSourceFactory │ │ ├─ RtmpDataSource (BaseDataSource) │ │ └─ NativeRtmpClient (JNI 封装) │ ├──────────────────────────────────────────┤ │ 原生层 (C) │ │ ├─ rtmp-jni.so (JNI 桥接) │ │ └─ librtmp (内嵌,IPv6 补丁版) │ ├──────────────────────────────────────────┤ │ 数据层 │ │ └─ Room + Repository (StreamEntity) │ └──────────────────────────────────────────┘ ``` ### 目录结构 ``` app/src/main/ ├── java/com/dragon/dlplayer/ │ ├── MainActivity.kt # 入口 Activity │ ├── navigation/NavGraph.kt # 导航(3 个路由) │ ├── data/ │ │ ├── StreamEntity.kt # Room 实体 │ │ ├── StreamDao.kt # Room DAO │ │ ├── AppDatabase.kt # Room 数据库 │ │ └── StreamRepository.kt # 仓库 │ ├── rtmp/ │ │ ├── NativeRtmpClient.kt # JNI 声明 │ │ ├── RtmpDataSource.kt # Media3 DataSource │ │ └── RtmpDataSourceFactory.kt # DataSource 工厂 │ └── ui/ │ ├── screen/ │ │ ├── StreamListScreen.kt # 流列表页 │ │ ├── PlayerScreen.kt # 播放器页 │ │ └── AboutScreen.kt # 关于页 │ └── theme/ │ ├── Color.kt │ ├── Theme.kt │ └── Type.kt ├── cpp/ │ ├── CMakeLists.txt # CMake 构建配置 │ ├── rtmp-jni.c # JNI 桥接 │ └── librtmp/ # 内嵌的 RTMPDump 2.4 │ ├── rtmp.c / rtmp.h / rtmp_sys.h │ ├── amf.c / amf.h │ ├── parseurl.c │ ├── handshake.h │ ├── log.c / log.h │ └── ... └── res/ # 资源文件 ``` ## 自定义 RTMP DataSource 官方的 `media3-datasource-rtmp:1.10.1` 内置了一个 2015 年的 librtmp,使用 `gethostbyname()` 做 DNS 解析,仅支持 IPv4。DLPlayer 用自定义实现替换了它: 1. **内嵌 RTMPDump 2.4 librtmp** — 打上 IPv6 补丁,使用 `getaddrinfo(AF_UNSPEC)` 进行双栈 IPv4/IPv6 解析,用 `struct sockaddr_storage` 替代 `struct sockaddr_in` 做到协议无关的 socket 处理。 2. **JNI 桥接** (`rtmp-jni.c`) — 薄 C 层,将 librtmp 的调用(`RTMP_Connect`、`RTMP_Read`、`RTMP_Close` 等)封装为 Kotlin 可调用的 JNI 方法。 3. **Media3 集成** (`RtmpDataSource`) — 实现 `BaseDataSource` 和 `DataReader`,通过 `RtmpDataSourceFactory` 将原生 RTMP 客户端接入 ExoPlayer 的流管道。 4. **NO_CRYPTO** — 编译时关闭 OpenSSL/加密支持。普通 RTMP(最常用的直播协议)正常工作,RTMPE 和 RTMPS 不支持。 ### 连接流程 ``` ExoPlayer → RtmpDataSource.open(url) → NativeRtmpClient.open(url) → RTMP_SetupURL() → RTMP_Connect() ← TCP 连接 (IPv4/IPv6) → RTMP_ConnectStream() → RtmpDataSource.read() → NativeRtmpClient.read() → RTMP_Read() ← 从网络读取数据 ``` ## 添加直播流 1. 在流列表页点击 **+** 浮动按钮 2. 输入流名称和 IP 地址 3. IPv6 地址会自动加上方括号(例如 `::1` 变为 `[::1]`) 4. 最终 URL 格式为 `rtmp://{ip}/live/{name}` ## 下载 [下载 DLPlayer](https://gitee.com/DragonCodingPlus/dlplayer/releases/download/V1.0/DLPlayer-1.0.apk) [DLPlayer网站](http://mjlong123.top/products/dlplayer) [作者 DragonCoding](http://mjlong123.top)