简易抖音项目-视频模块
简易抖音项目-视频模块
简易抖音项目-视频模块设计说明
需求分析
视频模块包括包括视频Feed流获取、视频投稿和获取用户投稿列表三个模块
1. 视频流接口 /douyin/feed/
不限制登录状态,返回按投稿时间倒序的视频列表,视频数由服务端控制,单次最多30个。
接口定义:
service Feed {
rpc Feed (douyin_feed_request) returns (douyin_feed_response) {}
}
message douyin_feed_request{
int64 latest_time = 1; // 可选参数,限制返回视频的最新投稿时间戳,精确到秒,不填表示当前时间
string token = 2; // 可选参数,登录用户设置
}
message douyin_feed_response{
int32 status_code = 1; // 状态码,0-成功,其他值-失败
string status_msg = 2; // 返回状态描述
repeated Video video_list = 3; // 视频列表
int64 next_time = 4; // 本次返回的视频中,发布最早的时间,作为下次请求时的latest_time
}
2. 发布列表 /douyin/publish/list/
登录用户的视频发布列表,直接列出用户所有投稿过的视频。
接口定义:
service PublishList {
rpc PublishList (douyin_publish_list_request) returns (douyin_publish_list_response) {}
}
message douyin_publish_list_request{
int64 user_id = 1; // 用户id
string token = 2; // 用户鉴权token
}
message douyin_publish_list_response{
int32 status_code = 1; // 状态码,0-成功,其他值-失败
string status_msg = 2; // 返回状态描述
repeated Video video_list = 3; // 用户发布的视频列表
}
3. 视频投稿 /douyin/publish/action/
登录用户选择视频上传。
接口定义:
service PublishAction {
rpc PublishAction (douyin_publish_action_request) returns (douyin_publish_action_response) {}
}
message douyin_publish_action_request{
string token = 1; // 用户鉴权token
bytes data = 2; // 视频数据
string title = 3; // 视频标题
}
message douyin_publish_action_response{
int32 status_code = 1; // 状态码,0-成功,其他值-失败
string status_msg = 2; // 返回状态描述
}
整体架构设计
返回的状态码(虽然客户端并没有逻辑进行处理):
- 用户不存在,状态码为2
- 应该携带Token但是没有携带,状态码为4
- 备份文件夹操作失败,状态码为5
- 无法写入视频文件,状态码为6
- 无法写入图片文件,状态码为7
- 无法上传文件到OSS,状态码为8
详细设计
视频流接口
- DY-api.Feed处理请求,准备请求服务
- 首先请求DY-srv.Feed服务,根据时间戳查询数据库,查询出不超过时间戳的前30个视频,查询后返回视频列表
- 随后并行请求视频列表中的每一个视频(即最大并发数为30)
- 对每一个视频,根据前一个服务响应的作者的id并行请求DY-srv.UserInfo、DY-srv.GetFollowList和DY-srv.GetFollowerList,等待全部成功返回后记录Author响应相关的5个字段
- 对每一个视频,根据视频id并行请求DY-srv.和DY-srv.,对于每个视频
- commentCount通过获取DY-srv.返回的切片长度获取
- favoriteCount通过获取DY-srv.返回的切片长度获取
- 通过Token获取当前的登录用户id,在DY-srv.切片内部查询,如果查询到为True,否则为False
- 等待全部的视频返回响应后,构建响应结构体并返回给客户端
发布列表
- DY-api.PublishList处理请求,准备请求服务
- 首先请求DY-srv.PublishList服务,根据id查询数据库,如果id在数据库中不存在,则直接返回错误,然后根据用户id查询发布的视频列表并返回
- 随后并行请求DY-srv.UserInfo、DY-srv.GetFollowList和DY-srv.GetFollowerList,等待全部成功返回后记录User响应相关的5个字段
- 对每一个视频,根据视频id并行请求DY-srv.和DY-srv.,对于每个视频
- commentCount通过获取DY-srv.返回的切片长度获取
- favoriteCount通过获取DY-srv.返回的切片长度获取
- 通过Token获取当前的登录用户id,在DY-srv.切片内部查询,如果查询到为True,否则为False
- 等待全部的视频返回响应后,构建响应结构体并返回给客户端
视频投稿
- DY-api.PublishAction处理请求,将请求中的字段传递到服务端DY-srv.PublishAction
- 服务端从Token中获取id信息,如果无法获取id,直接返回错误
- 服务端根据id信息查询数据库,获取用户信息,如果id并不存在于数据库,则直接返回错误
- 服务端判断本地存放视频与图片文件的文件夹是否存在,如果不存在则创建文件夹
- 服务端将接收到的请求中的字节流写入文件,并调用ffmpeg对视频的第一帧进行截图作为封面,同样写入图片文件
- 服务端将文件上传信息传递给消息队列,直接返回成功响应给客户端
- 消息队列接收到消息后并行上传视频和图片文件,两者都上传成功后将视频信息写入数据库
简易抖音项目-视频模块
https://zhangzhao219.github.io/2023/01/24/ByteDanceYouthTrainCamp/ByteDanceYouthTrainCamp-Project-Videos/