VideoPlayer icon indicating copy to clipboard operation
VideoPlayer copied to clipboard

🔥🔥🔥 看: 本地视频/斗鱼直播/央视/地方卫视/美剧/电影. MVVM/爬虫/ffmpeg/openGL

  • Info
  • 测试驱动开发
  • module模块介绍
    • QMediaSpider
  • 实现的功能
  • 依赖框架和技术
  • 资源获取方法
    • 各大卫视网络源和图标
    • 音乐资源获取
    • 斗鱼直播
      • 抓取到房间号后,通过real-url获取直播链接
      • 手动获取
      • python破解方式参考(失效)
  • Todo
  • 参考
  • 遇到的问题
  • 开发经验

Info

项目demo

这是一个视频播放器,又不仅仅是一个播放器。它不仅能观看本地视频,还能看斗鱼直播, 能看央视和各大地方卫士,能看美剧和电影。许多功能正在紧张的开发中。。。敬请期待

怎么使用

git clone --recursive https://github.com/tainzhi/VideoPlayer

# 如果忘记 recursive clone
git submodule update --init --recursive

测试驱动开发

  • 先完成功能模块: 读取卫视列表到database, test成功
  • SurfaceView
  • TextureView
  • GLSurfaceView: effect, 截屏

module模块介绍

QMediaPlayer

  • Surface/TextureView/GLSurface
  • Android MediaPlayer/IjkPlayer/exoplayer, 特效, 水印, 缓存视频

common

  • BaseFragment支持懒加载

QMediaSpider

  • 爬取网络视频资源, 使用到技术有Jsoup, Volley, android test等等.
  • 破解算法参考real-url
  • DouyuSpider

ffmpeg

  • 此module封装了ffmpeg-4.3, 用ndk20b编译
  • 该module可以执行ffmpeg命令, 在cpp线程中执行, 提供了回调,命令执行进度,命令停止功能
  • 编译过程和使用参考ffmpeg/README.md
  • ffmpeg还支持了rtmp和hls推送

danmmu

  • 弹幕库, 分为简单版和复杂版
  • 复杂版弹幕库有缓冲池功能, 性能更好 详情参见

实现的功能

  • PlayVideoViewActivity: VideoView+MediaController简单播放功能

依赖框架和技术

  • javaMVP(第一版): MVP, retrofit2, rxjava2等等
  • master(当前开发版): kotlin, MVVM(google jetpack), jsoup, ijkplayer, mediaplayer, exoplayer, koin, retrofit, okhttp
功能
lottie 动画
Jsoup 网页解析(爬虫)
moshi 替换Gson为moshi
NotchScreenTool 刘海屏全面屏工具,全屏播放时使用刘海
[弃用]Volley,使用简单封装的HttpUrlConnection 网络请求

资源获取方法

各大卫视网络源和图标

音乐资源获取

斗鱼直播

douyu开发者平台:3月公测, 不开放给个人开发者

一些斗鱼api

抓取到房间号后,通过real-url获取直播链接

  • 怎么通过chrome的js调试器, 下断点, 获取直播地址:
  • 具体方法: 先找到返回源地址的POST或GET操作,观察其传入的参数,再到JS中搜索并找到相关代码块,随后通过下断点,一步步调试即可

手动获取

斗鱼原先提供的v1可以直接获取直播地址的api已经失效,暂时无法获取地址。Demo中使用了一个24h直播间https://www.douyu.com/3346305,手动获取地址,来测试。 斗鱼直播源破解参考

具体破解步骤:

  • 假设原直播源地址为http://hlsa.douyucdn.cn/live/431935rYIJ0kKhQ4_550/playlist.m3u8?wsSecret=924a83c6700d9d802a7717f1068811f6&wsTime=1558565155&token=h5-douyu-0-431935-373ef2a3e162f552b55145ccdd4571a3&did=h5_did
  • 直播源地址格式固定为http://hlsa.douyucdn.cn/live/*_550/playlist/*.
  • 替换hlsa为tx2play1, _550为普通清晰度,去除改为默认最高清晰度
    • 最终结果http://tx2play1.douyucdn.cn/live/431935rYIJ0kKhQ4.flv 主线路: http://hdls1a.douyucdn.cn/live/9999rhwySJw8y5P6_1200p.flv 线路5: http://tc-tct.douyucdn2.cn/dyliveflv1a/431935rgDRxvP0IV.flv // val roomCircuitId = mViewModel.getRoomCircuit(room.room_id.toString()) // val circuit = "http://tx2play1.douyucdn.cn/live/${roomCircuitId}_550.flv"
  • https://tc-tct.douyucdn2.cn/dyliveflv1a/431935rgDRxvP0IV.flv
  • http://hdls1a.douyucdn.cn/live/431935rgDRxvP0IV_550.flv https和http的区别
  • tx2play1和hlds1a的区别

python破解方式参考(失效)

电影资源获取

Todo

  • [ ] 参考GSYVideoPlayer的GSYVideoGLViewCustomRender实现水印效果
  • [] Easy Permissions
  • [] PermissionX
  • [] 使用composing build, 而不是buildSrc
  • [] manage network usage)
  • [] 使用Paging
  • [] detekt: 代码检测和kotlin编码规范
  • [] detek添加hook
  • [ ] motionlayout实现酷炫的动画
  • [ ] 电影界面通过flexbox-layout实现酷炫的效果
  • [x] Fab播放按钮, 播放最近观看记录; 使用Snackbar替换Toast,参考1, 2
  • [ ] 添加广告,gif截图
  • [ ] 本地视频列表缩略实现, 参考我的印象笔记相同缩略图笔记内容
  • [ ] 竖屏视频播放(通过CotentProvider查询到的orientation方向null, 但是resolution=1080*1920, 添加手动判断横屏或者竖屏)]
  • [ ] 本地列表第一个是最近的播放记录, 记录播放位置, 并显示上次播放到的时间点的缩略图
  • [ ] 实现沉浸式状态栏: 参考1 参考2
  • [ ] 申请权限管理
  • [ ] 参考WanAndroid todo
  • [ ] 进度条+小窗显示
  • [ ] 悬浮窗播放: 赋予权限 参考
  • [ ] 记录视频播放记录
  • [ ] 混淆编译
  • [ ] 添加自动测试模块
  • [ ] 搭建一个局域网服务器, 类似小米阅读通过wifi从电脑传书到手机, NanoHttp, AndServer
  • [ ] 学习竞品: MX播放器, XPlayer, VLC, VideoPlayer等播放列表, 播放界面(全屏透明状态栏)等功能, 实现它们
  • [ ] 学习Douyu新版, 看有什么想实现的功能; 如果能逆向出直播源就更好了
  • [ ] 学习竞品: 小米视频

buildSrc.AutoUpload插件的使用

  • ./gradlew autoupload自动编译上传到蒲公英
  • 但是需要添加pgy渠道

github action的使用

  • git tag -a v0.1.0新建tag后, git push origin v0.1.0推送tag到远程后触发

参考

  • bugly: 没有下载次数限制; 继承方便, 提供升级页面; 不用验证身份证; 唯一缺点, 没有提供api, 无法自动上传apk
  • 蒲公英分发平台: 提供了api, 可以编写gradle插件自动上传; 缺点是需要身份证验证, 有下载次数限制

遇到的问题

开发经验

  • 专注于目标,而不是技术
  • 不要苛求于和原来的技术实现相同, 只要能解决问题, 哪管它新的实现思路
  • 对于某些实现细节的代码不熟悉不懂, 可以在github上高级搜索, 学习相应的代码段