当新图像传入时,让 ffmpeg 将图像转换为视频
Keep ffmpeg converting images to video when new images are incoming
有没有办法让 ffmpeg 转换传入 HLS 的图像,并在需要时停止?
我正在使用 ffmpeg 将图像转换为 m3u8/ts 以进行流式传输。相机设备将全天候 24/7 发送图像,ffmpeg 将在用户请求时转换这些图像,直到他们停止观看。
现在,我通过 Java 网络从相机设备获取图像,然后将这些图像移动到 ffmpeg 输入目录并使用 C++ 转换它们。这是一个执行此工作的循环,因此每次移动图像时都会执行新的 ffmpeg。
问题是剩余的 ts 文件太多,它们占用了服务器上的大量空间。所以我尝试删除带有 delete_segments 选项的那些,但是由于每次都执行 ffmpeg,它无法删除它之前由 ffmpeg 制作的片段。
以下是我考虑的一些方法:
- 用另一个函数删除文件,不用ffmpeg。
- 也许将图像直接传输到 ffmpeg 输入,并以某种方式让 ffmpeg 继续将这些图像转换为 ts。 (我怎么也想不出来)
- 或者改变整个结构。
使用选项 1 会容易得多,但如果我可以使用 ffmpeg 自己的函数来完成此操作,那就太好了。
您可以使用输入文件列表,它可以是一个特殊文件(例如 FIFO 管道)。
那么您的命令可能如下所示:
mkfifo mylist.pipe
ffmpeg -f concat -safe 0 -i mylist.pipe output.mkv
并且可以将每张图片添加到mylist.pipe,如下:
echo "file '/path/to/image.png'" >mylist.pipe
echo "file '/path/to/image2.png'" >mylist.pipe
如果路径是相对路径,则不需要 -safe 0
部分。
见https://trac.ffmpeg.org/wiki/Concatenate#Automaticallyappendingtothelistfile
有没有办法让 ffmpeg 转换传入 HLS 的图像,并在需要时停止?
我正在使用 ffmpeg 将图像转换为 m3u8/ts 以进行流式传输。相机设备将全天候 24/7 发送图像,ffmpeg 将在用户请求时转换这些图像,直到他们停止观看。
现在,我通过 Java 网络从相机设备获取图像,然后将这些图像移动到 ffmpeg 输入目录并使用 C++ 转换它们。这是一个执行此工作的循环,因此每次移动图像时都会执行新的 ffmpeg。
问题是剩余的 ts 文件太多,它们占用了服务器上的大量空间。所以我尝试删除带有 delete_segments 选项的那些,但是由于每次都执行 ffmpeg,它无法删除它之前由 ffmpeg 制作的片段。
以下是我考虑的一些方法:
- 用另一个函数删除文件,不用ffmpeg。
- 也许将图像直接传输到 ffmpeg 输入,并以某种方式让 ffmpeg 继续将这些图像转换为 ts。 (我怎么也想不出来)
- 或者改变整个结构。
使用选项 1 会容易得多,但如果我可以使用 ffmpeg 自己的函数来完成此操作,那就太好了。
您可以使用输入文件列表,它可以是一个特殊文件(例如 FIFO 管道)。
那么您的命令可能如下所示:
mkfifo mylist.pipe
ffmpeg -f concat -safe 0 -i mylist.pipe output.mkv
并且可以将每张图片添加到mylist.pipe,如下:
echo "file '/path/to/image.png'" >mylist.pipe
echo "file '/path/to/image2.png'" >mylist.pipe
如果路径是相对路径,则不需要 -safe 0
部分。
见https://trac.ffmpeg.org/wiki/Concatenate#Automaticallyappendingtothelistfile