我正在为一个项目开发转码器后端,该项目旨在为前端播放器提供静态 mpeg-dash 清单和文件。我正在尝试弄清楚如何从 ffmpeg 将多个输出放入多个管道。
其中一个后端路由接收一个视频文件,并使用 ffmpeg 将该视频文件转换为多个 mpeg-dash 表示。我已经有一个命令可以使用 ffmpeg wiki 中的示例命令将给定的 mp4 转换为清单、2 个视频表示和 1 个音频表示:
ffmpeg -re -i input.mp4 -c:a aac -c:v libx264 -map 0 -map 0 -b:v:0 800k -b:v:1 300k -s:v:1 320x170 -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 -b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 -adaptation_sets "id=0,streams=v id=1,streams=a" -single_file 1 -f dash output.mpd
我面临的问题是:如何将此 ffmpeg 命令的输出放入管道而不是文件中?
答案1
对于任何与我处于类似情况并想要制作一个对上传的视频进行转码的服务器的人,我找到了一个非常好的解决方案,但它并不涉及我最初认为最好的管道。
事实证明,ffmpeg 会自动处理 http url 类型的文件名,因此通过创建一些从 minio 存储桶读取/写入对象的内部路由,我就能让它正常工作。
我的最终命令是这样的:
ffmpeg -re -i http://localhost:8080/read/input.mp4 \
-c:a aac \
-c:v libx264 \
-map 0 -map 0 \
-b:v:0 800k \
-b:v:1 300k \
-s:v:1 320x170 \
-bf 1 \
-keyint_min 120 \
-g 120 \
-sc_threshold 0 \
-b_strategy 0 \
-ar:a:1 22050 \
-use_timeline 1 \
-use_template 1 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-single_file 1 \
-f dash http://localhost:8080/write/output.mpd
这会导致所有输出流向类似这样的 URL 发出请求:
http://localhost:8080/write/output-stream1.mp4
等等。
重要的一点是,您的读取路线必须支持需要可寻址的文件类型(如 mp4)的字节范围。