我需要创建一个简单的应用程序,我必须在其中流式传输视频并将视频转换为 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 实时转换它
此解决方案无法通过使用单个 ffmpeg 命令来实现以给定方式构建流解决方案。
解决步骤:
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