当前位置: 首页 > 面试题库 >

您可以将图像“流化”到ffmpeg来构造视频,而不是将其保存到磁盘吗?

蓝苗宣
2023-03-14
问题内容

我最近的工作涉及以编程方式制作视频。在python中,典型的工作流程如下所示:

import subprocess, Image, ImageDraw

for i in range(frames_per_second * video_duration_seconds):
    img = createFrame(i)
    img.save("%07d.png" % i)

subprocess.call(["ffmpeg","-y","-r",str(frames_per_second),"-i", "%07d.png","-vcodec","mpeg4", "-qscale","5", "-r", str(frames_per_second), "video.avi"])

此工作流程为视频中的每个帧创建一个图像并将其保存到磁盘。保存所有图像后,将调用ffmpeg从所有图像构建视频。

将映像保存到磁盘(而不是在内存中创建映像)会占用此处的大部分周期,并且似乎没有必要。有什么方法可以执行相同的功能,但不将图像保存到磁盘吗?因此,将调用ffmpeg,然后将图像构建并在构建后立即将其馈送到ffmpeg。


问题答案:

好吧,我知道了。感谢LordNeckbeard建议使用image2pipe。我必须使用jpg编码而不是png,因为带png的image2pipe在我的ffmpeg版本上不起作用。第一个脚本与您的问题的代码基本相同,除了我实现了一个简单的图像创建功能,即仅创建从黑色到红色的图像。我还添加了一些代码来计时执行时间。

串行执行

import subprocess, Image

fps, duration = 24, 100
for i in range(fps * duration):
    im = Image.new("RGB", (300, 300), (i, 1, 1))
    im.save("%07d.jpg" % i)
subprocess.call(["ffmpeg","-y","-r",str(fps),"-i", "%07d.jpg","-vcodec","mpeg4", "-qscale","5", "-r", str(fps), "video.avi"])

并行执行(不将任何图像保存到磁盘)

import Image
from subprocess import Popen, PIPE

fps, duration = 24, 100
p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'mjpeg', '-r', '24', '-i', '-', '-vcodec', 'mpeg4', '-qscale', '5', '-r', '24', 'video.avi'], stdin=PIPE)
for i in range(fps * duration):
    im = Image.new("RGB", (300, 300), (i, 1, 1))
    im.save(p.stdin, 'JPEG')
p.stdin.close()
p.wait()

结果很有趣,我运行了每个脚本3次以比较性能: 串行:

12.9062321186
12.8965060711
12.9360799789

平行:

8.67797684669
8.57139396667
8.38926696777

因此,似乎并行版本的速度要快1.5倍左右。



 类似资料:
  • 问题内容: 我的Express应用程序正在从浏览器中接收base64编码的PNG(使用toDataURL()从画布生成)并将其写入文件。但是该文件不是有效的图像文件,因此“文件”实用程序只是将其标识为“数据”。 问题答案: 我认为您正在转换的数据比您需要的更多。一旦使用正确的编码创建了缓冲区,您只需要将缓冲区写入文件即可。 new Buffer(…,’base64’)通过将输入解释为base64编

  • 我一直在使用系统保存截图的方式将位图保存到磁盘和图库中。这在Android4.2及之前版本中有效,但在Android3.3中无效。 相关代码: 此处为完整代码。 然而,在4.3(新的Nexus 7)中,我在第二行得到了FileNotFoundException。我在网站上看不到与此相关的4.3中的任何更改。 那么,将图像保存到磁盘和图库的正确方法是什么呢? 已验证: 使用此方法装载存储 image

  • 音频和视频都能在第一次正确播放,在音频播放完成时视频循环(因为它更短)。唯一的问题是音频循环不工作,一旦音频第一次完成,流就停止了。 以下是日志: ffmpeg version 4.3.1版权所有(c)2000-2020 ffmpeg开发人员 使用Apple clang version 12.0.0(clang-1200.0.32.27) 配置构建:--prefix=/usr/local/cell

  • 问题内容: 几天前,我被要求检查从互联网下载视频时播放视频的难度。我知道这很容易,因为有人在不久前告诉我。所以,我检查了一下,这非常容易。 问题是我想将视频保存到磁盘上,而不是强迫用户一次又一次地下载它。 问题是访问缓冲区并将其存储到磁盘。 Stackoverflow中的许多答案都说不可能。特别是视频。 我播放视频的原始代码: 问题答案: 解决此问题的方法是使用和: 第一步是添加一条通知,以了解视

  • 下面的代码在内存中创建了一个文件。 我想把那个pdf文件保存在磁盘上以便查看。我将如何在python中实现它?

  • 我对JavaCV FFMPEGFrameRecOrder的使用有点困惑。我有几个字节[]或短[]数组(取决于我的图像是8位还是16位),如果我有几个图像的相关数据。现在,我的想法是使用JavaCPP将每个图像发送到ffmpeg,这样它就可以在我希望的framerate上从这个集合中创建一个静音视频。到目前为止,我有: 但我经常犯这样的错误 谢了!