我有一个 C 应用程序,它连续生成一系列图像:frame_1.png、frame_2.png、frame_3.png 等。该应用程序永不停止,这意味着它运行的时间越长,生成的图像就越多。当应用程序运行时,我希望 FFmpeg 将这些图像即时转换为视频。因此,应用程序和 FFmpeg 运行的时间越长,输出视频文件就应该越大。FFmpeg 永远不会终止,并且应该始终等待新帧。我该如何实现这一点?
到目前为止,我有这个:ffmpeg -i "frame_%d.png" output.avi
。不幸的是,这并没有真正实现我想要的效果。它只是在我执行 FFmpeg 命令时迭代文件系统上存在的文件,生成视频,并在处理完最后一张图片后终止。
我也尝试过使用 FIFO,如下所示:(1)运行mkfifo fifo.png
。(2)运行 C 应用程序。在 C 应用程序内部,我在循环(伪代码)中编写了类似这样的代码:fd = open("fifo.png"); write_new_frame_as_png(fd); close(fd);
。(3)运行ffmpeg -i fifo.png output.avi
。不幸的是,这也不起作用。C 应用程序生成一帧并阻塞,直到我运行 FFmpeg。然后 FFmpeg 只读取 FIFO 的一个帧,生成一帧视频文件并终止。
所以我的问题是,如何告诉 FFmpeg 在新帧到达时实时生成视频?
谢谢。
附言:如果您想知道我为什么要做上述操作:最终,我想使用 FFmpeg 和 FFserver 来流式传输实时视频,我想这个问题涵盖了实现这一目标的第一步。