java - 当新图像传入时,保持 ffmpeg 将图像转换为视频
问题描述
有没有办法让 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
推荐阅读
- azure - 如何管理同步本地 SSO 数据库和 Azure AD B2C 的场景?
- file - 通过cordova-plugin-file选择本地文件并通过xhr上传
- android - 如何在 Flutter 中使用 dart:ffi 打印到控制台?
- java - intellij java桌面应用如何使用资源
- php - 为下拉菜单编辑 php
- javascript - 使用循环、开关和 if 语句和数组的年龄计算器
- javascript - 从源代码构建 V8
- python - 绘图的参数可以保存在 Python 中的可传递变量中吗?
- model-view-controller - 如何强制 Phalcon 从另一个模块而不是定义中选择视图?
- java - android.os.Parcel.readException 中的 java.lang.SecurityException