我有一个生成一系列图像的C程序,我想把它们制作成一个视频,应该实时流媒体或存储在文件中。在阅读ffmpeg文档时,我反复发现ffmpeg可以从命名管道获取输入。
我的问题是文件应该以什么格式输入管道,以及如何将文件输入管道
据我所知,对将放在命名管道中的视频的格式没有任何要求。你可以放任何ffmpeg能打开的东西。例如,我使用ffmpeg库开发了一个程序,该程序从命名管道读取h264视频并从中检索统计信息——命名管道是通过另一个程序填充的。这真的是一个非常好的和干净的解决方案,为连续视频。
现在,关于您的情况,我相信您有一个小问题,因为命名管道只是一个文件,ffmpeg将无法知道在同一个文件中有多个图像!因此,如果您声明命名管道作为输入,ffmpeg将认为您只有一个图像-不够好…
我能想到的一个解决方案是声明您的命名管道包含一个视频-因此ffmpeg将不断地从它读取并存储它或流式传输它。当然,你的C程序需要生成视频并将其写入命名管道…这并没有看起来那么难!你可以将你的图像(你还没有告诉我们它们的格式是什么)转换为YUV,并简单地在命名管道中一个接一个地写入(YUV视频是一系列无标题的YUV图像-你也可以很容易地从BPM转换为YUV,只需查看维基百科上关于YUV的条目)。然后ffmpeg将认为命名管道包含一个简单的YUV文件,因此您最终可以从中读取并对其进行任何操作。
您可以使用*-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秒创建一个新帧。
使用带有通配符文件名的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);