使用命名管道为ffmpeg提供输入

时间:2011-04-06 19:01:27

标签: image encoding ffmpeg named-pipes video-encoding

我有一个生成一系列图像的C程序,我想把它们变成一个应该实时流式传输或存储在文件中的视频。在阅读ffmpeg文档时,我偶然发现ffmpeg可以从命名管道获取输入。

我的问题是管道中的文件应该采用何种格式,以及如何将文件输入管道。

3 个答案:

答案 0 :(得分:5)

据我所知,对于将放入命名管道的视频格式没有任何要求。你可以放任何ffmpeg可以打开的东西。例如,我使用ffmpeg库开发了一个程序,该库从命名管道读取h264视频并从中检索统计信息 - 命名管道通过另一个程序填充。对于连续视频来说,这确实是一个非常好的和干净的解决方案。

现在,关于你的情况,我相信你有一个小问题,因为命名管道只是一个文件而ffmpeg将无法知道同一个文件中有多个图像!因此,如果您将命名管道声明为输入,ffmpeg将认为您只有一个图像 - 不够好......

我能想到的一个解决方案是声明你的命名管道包含一个视频 - 所以ffmpeg将不断读取它并存储或流式传输。当然你的C程序需要生成并将该视频写入命名管道......这并不像看起来那么难!您可以将您的图像(您还没有告诉我们它们的格式是什么)转换为YUV,只需在命名管道中逐个编写(YUV视频是YUV图像的无头系列 - 您也可以轻松地从BPM转换为YUV,只需查看wikipedia entry on YUV)。然后ffmpeg会认为命名管道包含一个简单的YUV文件,因此您最终可以从中读取并使用它执行任何操作。

答案 1 :(得分:3)

您可以使用* -loop_input *命令行选项:

ffmpeg -loop_input -re -timestamp now -f image2 -r 25 -sameq -i input.jpg -an -vcodec mpeg2video out.mp4

在您的情况下,将 input.jpg 替换为管道。然后,FFmpeg将每1/25秒从输入文件(或管道)创建一个新帧。

答案 2 :(得分:-2)

将image2与通配符文件名一起使用,假设这些图像作为文件存在,来自ffmpeg文档:

for creating a video from the images in the file sequence ‘img-001.jpeg’, ‘img-002.jpeg’, ..., assuming an input frame rate of 10 frames per second:

ffmpeg -i 'img-%03d.jpeg' -r 10 out.mkv

AVFormatContext *pFormatCtx = avformat_alloc_context();
avformat_open_input(&pFormatCtx,"img-%03d.jpeg",NULL,NULL);
相关问题