简易抖音项目-视频模块

简易抖音项目-视频模块

简易抖音项目-视频模块设计说明

需求分析

视频模块包括包括视频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; // 返回状态描述
}

整体架构设计

pSodXSP.png

返回的状态码(虽然客户端并没有逻辑进行处理):

  • 用户不存在,状态码为2
  • 应该携带Token但是没有携带,状态码为4
  • 备份文件夹操作失败,状态码为5
  • 无法写入视频文件,状态码为6
  • 无法写入图片文件,状态码为7
  • 无法上传文件到OSS,状态码为8

详细设计

视频流接口

pSowAS0.png

  1. DY-api.Feed处理请求,准备请求服务
  2. 首先请求DY-srv.Feed服务,根据时间戳查询数据库,查询出不超过时间戳的前30个视频,查询后返回视频列表
  3. 随后并行请求视频列表中的每一个视频(即最大并发数为30)
  4. 对每一个视频,根据前一个服务响应的作者的id并行请求DY-srv.UserInfo、DY-srv.GetFollowList和DY-srv.GetFollowerList,等待全部成功返回后记录Author响应相关的5个字段
  5. 对每一个视频,根据视频id并行请求DY-srv.和DY-srv.,对于每个视频
    1. commentCount通过获取DY-srv.返回的切片长度获取
    2. favoriteCount通过获取DY-srv.返回的切片长度获取
    3. 通过Token获取当前的登录用户id,在DY-srv.切片内部查询,如果查询到为True,否则为False
  6. 等待全部的视频返回响应后,构建响应结构体并返回给客户端

发布列表

pSow3Sx.png

  1. DY-api.PublishList处理请求,准备请求服务
  2. 首先请求DY-srv.PublishList服务,根据id查询数据库,如果id在数据库中不存在,则直接返回错误,然后根据用户id查询发布的视频列表并返回
  3. 随后并行请求DY-srv.UserInfo、DY-srv.GetFollowList和DY-srv.GetFollowerList,等待全部成功返回后记录User响应相关的5个字段
  4. 对每一个视频,根据视频id并行请求DY-srv.和DY-srv.,对于每个视频
    1. commentCount通过获取DY-srv.返回的切片长度获取
    2. favoriteCount通过获取DY-srv.返回的切片长度获取
    3. 通过Token获取当前的登录用户id,在DY-srv.切片内部查询,如果查询到为True,否则为False
  5. 等待全部的视频返回响应后,构建响应结构体并返回给客户端

视频投稿

pSsa6xK.png

  1. DY-api.PublishAction处理请求,将请求中的字段传递到服务端DY-srv.PublishAction
  2. 服务端从Token中获取id信息,如果无法获取id,直接返回错误
  3. 服务端根据id信息查询数据库,获取用户信息,如果id并不存在于数据库,则直接返回错误
  4. 服务端判断本地存放视频与图片文件的文件夹是否存在,如果不存在则创建文件夹
  5. 服务端将接收到的请求中的字节流写入文件,并调用ffmpeg对视频的第一帧进行截图作为封面,同样写入图片文件
  6. 服务端将文件上传信息传递给消息队列,直接返回成功响应给客户端
  7. 消息队列接收到消息后并行上传视频和图片文件,两者都上传成功后将视频信息写入数据库

简易抖音项目-视频模块
https://zhangzhao219.github.io/2023/01/24/ByteDanceYouthTrainCamp/ByteDanceYouthTrainCamp-Project-Videos/
作者
Zhang Zhao
发布于
2023年1月24日
许可协议