# 2301ivideo **Repository Path**: yaotainxue/2301ivideo ## Basic Information - **Project Name**: 2301ivideo - **Description**: i视频 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-15 - **Last Updated**: 2025-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一.git # 二.0-1开发 ## 1.技术选型 语言:kotlin 架构:mvi 组件化模块化开发:ARouter 数据存储:mmkv、room 网络:okhttp、retrofit、协程、flow流 解耦:hilt依赖注入 aop面向切面思想:aspectJ(重点) 图片:glide(尺寸压缩、大图区域加载) ui:recyclerview+diffUtil、viewpager2、状态栏、约束布局。。。。 响应式编程:livedata、stateFlow 事件总线封装:eventbus、livedata、flow 音视频:原生(音频采集+画面采集+编码+封装mp4) exoPlayer\gsyplayer 直播:rtmp协议,原生NDK,三方腾讯云直播SDK ## 2.项目结构:library+module app:主壳,里面只有application library: (1)网络库、图片库、日志库、工具库、数据存储库、架构库。。。。基础库 (2)common:集成全部基础库,所有业务module引用 (3)特有库:音视频处理库、小说阅读器,部分业务module引用 业务module: module_main:主业务 module_home:首页 module_me:我的 module_cinema:放映厅 module_live:直播 module_publish:发布模块 。。。。。 # 三.MVI架构:单向数据流 m:model 数据层 v:view 视图层 i:Intent 意图 state:状态 1.工作原理 view发送意图给viewmodel-》viewmodel根据不同意图请求不同数据(仓库)-》viewmodel根据结果更新state状态(StateFlow)-->view订阅flow根据不同状态更新UI # 四。token问题 token:验证用户身份,点赞、关注、添加购物车带有用户行为接口都需要token校验 token:服务器采用JWT技术根据用户名+过期时间生成的token序列,服务器验证是否过期,用户是否存在 1.登录成功后服务器返回token,客户端保存token,下次请求接口时携带token,服务器验证成功则返回数据,失败则返回错误码,错误码为401,token失效。 2.token过期怎么办? (1)有感刷新:手动跳转到登录页面,重新登录获得新token (2)无感刷新:access_token和refresh_token access_token:有效期2个小时 refresh_toke:15天 a。客户端登录请求,服务器返回access_token和refresh_token,保存access_token和refresh_token b。点赞接口:携带access_token,服务器判断access_token是否过期,过期返回401,客户端通过一个特点接口,传入refresh_token,服务器返回新的access_token和refresh_token c。特点接口如果传入的refresh_token也过期了,则返回401,客户端只能跳转到登录页面,重新登录 3.主动退出登录token处理? (1)服务器删除token:发起退出登录接口,服务器将此token设置为无效 (2)客户端本地删除token 4.APP单设备:被迫退出登录:被人挤掉了 (1)主动轮询:每隔60秒发起check_token接口检查当前的token是否有效,无效被人挤掉,删除本地token,app未登录状态(不必要的网络开销) (2)长链接websocket:当新设备登录,服务器主动推送消息给旧设备,旧设备收到消息,提示用户被挤掉,删除本地token,app未登录状态 5.App多设备:服务器根据设备管理token,设备登录时间先后顺序,根据会员状态同时登录几个设备,踢掉最老的设备,客户端执行逻辑上面一样的 # 五.需求 ## 1.module_main:主页面 (1)闪屏页面,用户协议隐私对话框 (2)引导页,下次打开不执行引导页 (3)主页面:加载几个fragment ## 2.module_home:首页 (1)首页tab展示 (2)首页视频数据列表展示:列表播放一个视频,其他视频暂停播放,点赞局部增量刷新 (3)搜索页面:历史搜索记录,搜索结果,清除历史搜索记录 (4)点击item跳转到详情页面 (5)滑动recyclerview 红包转。访问接口上报金币 ## 3.module_cinema:放映厅 (1)三级联动 (2)视频列表:收藏、点赞、播放 (3)搜索页面:历史搜索记录,搜索结果,清除历史搜索记录 (4)点击item跳转到详情页面 (5)滑动recyclerview 红包转。访问接口上报金币 ## 4.module_detail:视频详情 ,首页和放映厅跳转到视频详情 (1)视频常见功能:播放、暂停、进度条、全屏播放,下载功能 (2)弹幕:显示弹幕,发送弹幕,显示实时弹幕 (3)简介:点赞、关注、分享、打赏、收藏。。。。,推荐视频列表 (4)评论:显示评论,发送评论,敏感词过滤。。。 (5)存储历史播放记录:哪个视频,播放进度 (5)观看视频 红包转。访问接口上报金币 ## 5.module_mine:我的页面 (1)登录和未登录状态:查看金币信息更新 (2)历史播放记录(进度、时间、标题、图片)、点赞视频、收藏视频、关注列表、下载的视频。。 (3)登录、注册等页面功能 (4)个人信息页面 (5)下载管理页面 (6)收藏管理页面 # 六.视频播放 ## 1.GSYVideoPlayer (1)播放内核:exoPlayer、mediaPlayer ijkPlayer aliPlayer (2)画面渲染:surfaceView、TextureView、GLSurfaceView (3)功能:播放、暂停、进度条、全屏播放,下载功能、弹幕。。。大小窗口播放 ## 2.exoPlayer、mediaPlayer ijkPlayer区别 (1)exoPlayer:谷歌官方推荐,支持自适应码率流媒体(DASH、HLS),支持弹幕、缓存。。 (2)mediaPlayer:安卓原生,适用于简单项目,支持媒体资源有限,不支持自适应码率流DASH、HLS (3)ijkPlayer:基于ffmpeg,支持硬解和软件,适用于所有格式视频,对于解码有特殊要求,可以选择 编码格式:H264、H265、MPEG-4、MPEG-2 硬解码:通过硬件解码,耗费GPU或硬件芯片,如:MediaCodec;不能完全兼容所有格式 软解码:通过代码解码,耗费CPU,如:ffmpeg;兼容所有格式 ## 3.surfaceView和View的区别 surfaceView:双缓冲机制,前置缓冲(显示当前帧),后置缓冲(提前准备下一帧),2个缓冲来回切换 ## 4.surfaceView和TextureView区别 (1)都适合于视频播放 (2)surfaceView:性能高,有独立的surface做渲染,不合成视图层,不能缩放、旋转等操作 (3)TextureView:性能低,参与视图合成,可以缩放、旋转等操作 ## 5.surfaceView 和 GLSurfaceView区别 (0)SurfaceView:只能2D (1)GLSurfaceView:基于openGL的 做3D效果:通过纹理(x,y,z) 做滤镜:通过片段着色器按照具体算法处理颜色:glsl文件 # 七.项目中视频播放技术 ## 1.gsy二次封装:定制化UI和功能 ## 2.exoPlayer # 八.弹幕实现 ## 1.自定义view完成弹幕 ## 2.使用三方库:烈焰弹幕bilibili ## 3.功能 (1)获得历史弹幕数据,按照时间、颜色、大小、是否会员完成弹幕的绘制 (2)发送弹幕 (3)实时显示弹幕数据:websocket # 八。音视频编解码相关 ## 1.摄像头采集---》yuv(NV21)原始数据--->放到队列中 ---轮询线程从队列中取出数据--->转成I420数据----》接口回调出去 ## 2.mediaCodec编码 ## 3.rtmp推流