项目实践 | 青训营

80 阅读1分钟

我的工作---发布视频

环境

  • 需要提前安装ffmpeg

发布视频的流程

  • 鉴权 ----- 使用别人的接口
  • 存储视频 ---- ( demo中 有 )
  • 抽取封面并存储
  • 视频 和 封面 上传到 cdn ( 没有, 因此没有做 )
  • 将收到的视频信息( 视频名称, 用户名, 播放地址, 封面的地址 )存储到数据库中 ---- 使用数据库的接口
  • 返回消息 ( 发布成功)

因此最先做的工作就是

  • 确定资源存储的位置, 通过查找路由得知, 有这样一个映射r.Static("/static", "./public"), 我们访问静态资源的时候, 网址为xxx/static/fileName.txt, 通过c.Request.Host字段, 来获得域名 : 2f781ee3592dd7a9ff0bbd0007fe40ce-app.1024paas.com, 加头(协议)加尾(路径 + 文件名), 进行字符串拼接
  • 使用ffmpeg来抽取某一帧来做封面, 需要设置 其 环境
// controller/ publish.go
// 没有其他合作者的提供的接口
func Publish(c *gin.Context) {
    // token, 鉴权
    
    // 存储
    err := c.SaveUploadedFile(data, saveFile);
    
    // 抽取并存储图片
    Vedio2Jpeg(saveFile, 6)
    
    // 拼接网址
    vedio_url := "https://"+ domain + "/static/"+ finalName
    
    // 放入数据库
    db.creat().....
    
}
​
​
​

抽取图片 demo

//  将视频抽取一帧, 转化为流
package examples
​
import (
    "bytes"
    "fmt"
    "io"
    "os"
​
    ffmpeg "github.com/u2takey/ffmpeg-go"
)
​
func ExampleReadFrameAsJpeg(inFileName string, frameNum int) io.Reader {
    buf := bytes.NewBuffer(nil)
    err := ffmpeg.Input(inFileName).
        Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
        Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}).
        WithOutput(buf, os.Stdout).
        Run()
    if err != nil {
        panic(err)
    }
    return buf
}

队友的接口

// 鉴权接口
// 参数: token, 返回: username
func ParseToken(token string) (string, error)
​
​
// 数据库接口---用户
func (*UserDao) FindUserByName(username string) (*User, error)
func (d *UserDao) FindUserById(id int64) (*User, error) 
_, err := models.NewUserDaoInstance().FindUserByName("qong");
​
// 数据库接口--- 视频
func (*VideoDao) CreateVideo(video *Video) (*Video, error) 
​

使用了接口之后的伪代码

func Publish(c *gin.Context) {
    // token, 鉴权
    token := c.PostForm("token")
    user_name, err := ParseToken(token);
    user, err := models.NewUserDaoInstance().FindUserByName(user_name)
    var user_id = user.UserId
    
    // 存储
    err := c.SaveUploadedFile(data, saveFile);
    
    // 抽取并存储图片
    Vedio2Jpeg(saveFile, 6)
    
    // 拼接网址
    vedio_url := "https://"+ domain + "/static/"+ finalName
    
    // 放入数据库
    video1 := models.Video{UserId : user_id, PlayUrl : vedio_url, CoverUrl : img_url , }
    _, err = models.NewVideoDaoInstance().CreateVideo(&video1)
    
}