使用 Golang 和 AWS 实时处理和保存视频

问题描述 投票:0回答:1

我需要创建一个简单的应用程序,我必须在其中流式传输视频并将视频转换为 hls 并在视频流式传输时将其保存在 aws s3 中(我等不及整个视频下载完毕,也等不及 ffmpeg 完成)将其上传到S3的转换)下面是我尝试的代码

import (
    "bytes"
    "io"
    "net/http"
    "os"
    "os/exec"

    "github.com/VinukaThejana/go-utils/logger"
)

func main() {
    res, err := http.Get("http://localhost/video.mp4")
    if err != nil {
        logger.Errorf(err)
    }
    payload, err := io.ReadAll(res.Body)
    if err != nil {
        logger.Errorf(err)
    }

    cmd := exec.Command("ffmpeg", "-i", "pipe:0", "-c:v", "libx264", "-preset", "ultrafast", "-tune", "zerolatency", "-f", "flv", "pipe:1")
    buffer := bytes.NewBuffer(make([]byte, 5*1024*1024))

    cmd.Stderr = os.Stderr
    cmd.Stdout = buffer

    stdin, err := cmd.StdinPipe()
    if err != nil {
        logger.Errorf(err)
    }

    err = cmd.Start()
    if err != nil {
        logger.Errorf(err)
    }

    _, err = stdin.Write(payload)
    if err != nil {
        logger.Errorf(err)
    }

    err = stdin.Close()
    if err != nil {
        logger.Errorf(err)
    }

    err = cmd.Wait()
    if err != nil {
        logger.Errorf(err)
    }

    output, err := os.Create("output.mp4")
    if err != nil {
        logger.Errorf(err)
    }
    defer output.Close()

    _, err = output.Write(buffer.Bytes())
    if err != nil {
        logger.Errorf(err)
    }
}

(上面给出的 ffmpeg 命令对于将视频转换为 hls 是不正确的,我只是把它放在那里只是为了让事情正常工作)

我不明白的是,我如何才能获取正在下载的视频流并将其保存在 s3 中,同时使用 ffmpeg 实时转换它

amazon-web-services go amazon-s3
1个回答
0
投票

此解决方案无法通过使用单个 ffmpeg 命令来实现以给定方式构建流解决方案。

解决步骤:

  1. 将 mp4 转换为块,并在创建块时将块详细信息推送到某个数据库。

ffmpeg -i input.mp4 -c copy -map 0 -f segment -segment_time 10 -segment_list playlist.m3u8 output_%03d.ts

2.选择这些块并将它们转换成hls视频

Create HLS manifest
echo "#EXTM3U" > playlist.m3u8
echo "#EXT-X-VERSION:3" >> playlist.m3u8
echo "#EXT-X-TARGETDURATION:10" >> playlist.m3u8
echo "#EXT-X-MEDIA-SEQUENCE:0" >> playlist.m3u8
for i in $(ls output_*.ts | sort -V); do
    echo "#EXTINF:10.000," >> playlist.m3u8
    echo "$i" >> playlist.m3u8
done
  1. 将该视频保存到 S3 中
© www.soinside.com 2019 - 2024. All rights reserved.