使用命名管道向ffmpeg输入数据

6
我有一个C程序,生成一系列图片,我想把它们制作成一个视频,可以实时流媒体播放或存储在文件中。在阅读ffmpeg文档时,我反复看到ffmpeg可以从命名管道中获取输入的信息。
我的问题是,应该将给管道的文件保存在什么格式中,以及如何将这些文件输入到管道中。
3个回答

7
据我所知,对于将要放入命名管道的视频格式没有任何要求。您可以放入任何ffmpeg可以打开的内容。例如,我使用ffmpeg库开发了一个程序,从命名管道中读取h264视频并从中检索统计信息 - 命名管道是通过另一个程序填充的。这确实是连续视频的非常好的清洁解决方案。
现在,关于您的情况,我认为您有一个小问题,因为命名管道只是一个文件,ffmpeg将无法知道同一文件中有多个图像!因此,如果您将命名管道声明为输入,ffmpeg将认为您只有一个图像-不够好...
我能想到的一个解决方案是声明你的命名管道包含一个视频 - 这样 ffmpeg 就会不断地从它读取并存储或流式传输它。当然,你的 C 程序需要生成并将该视频写入命名管道...这并不像看起来那么难!你可以将你的图像(你没有告诉我们它们的格式)转换为 YUV,并简单地在命名管道中一个接一个地写入它们(YUV 视频是一系列无头的 YUV 图像 - 你也可以轻松地从 BPM 转换为 YUV,只需查看 wikipedia entry on YUV)。然后 ffmpeg 就会认为该命名管道包含一个简单的 YUV 文件,因此你最终可以从中读取并对其进行任何操作。

3
好的,我会为您进行翻译。我用一种类似上面的方法解决了这个问题。我使用OpenCV将MJPEG流输出到命名管道中,然后使用FFmpeg对其进行编码。我认为OpenCV内部完成的MJPEG编码不应该占用太多CPU,因为它只是连续的JPEG图像流。另外,我的图像是以RGB位图的形式存在的。 - Akilan

4
您可以使用 *-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

使用带通配符的文件名来使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接