以1 FPS将PNG帧转换为视频


21

我有1 FPS的PNG格式的视频帧,我正在尝试使用ffmpeg将其转换为视频。

如果我做这样的事情:

ffmpeg -i data/input-%4d.png data/output.mp4

我得到的视频为25FPS,这基本上是输入的非常快的内容(以1FPS捕获)。

如果我尝试:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

我得到了VLC不想播放的内容:)

现在,如果我拍摄第一个视频(即FF视频)并应用滤镜使其速度变慢(例如-filter:v 'setpts=24.0*PTS'),则可以像1 FPS视频一样播放它,但是价格当然是文件大小。我猜它正在产生一堆重复的帧。

因此,问题是如何创建具有1 FPS且实际上以该速度播放的视频?输出格式btw对我而言并不重要。


我不确定ffmpeg是否足以从容器格式文件扩展名找出视频编解码器.mp4。尝试添加-vcodec libx264 -vpre hq到命令行,以告诉它编解码器和编码参数。
沃伦·杨

它实际上认为还可以,并且如上所述,我工作得很好,并且在添加时仅产生了奇怪的结果-r 1
阿萨夫·拉维

我认为您最好在stackoverflow.comsuperuser.com上的ffmpeg答案上好运。
达米安

Answers:


19

如果您希望使用FFMPEG的单线生成视频,该视频以每秒1帧的速度播放,那么您要做的就是为输入和输出指定帧速率,如下所示:

ffmpeg -r 1 -i data / input-%4d.png -pix_fmt yuv420p -r 10 data / output.mp4

-r 1意味着视频将以每秒原始图像之一的速度播放。
-r 10意味着视频将以每秒10帧的速度播放。

-pix_fmt yuv420p仅在此处可确保与多种播放程序兼容。例如,此处要求Windows Media Player可以播放视频。)

我测试了许多不同的输出帧率,而10似乎是您可以使用的最低数字,仍然可以产生VLC可以播放的视频。

当然,上面的命令意味着每个原始图像都会被相乘,但这是一种比您提到的“减慢速度”更简单的方法,并且根据编解码器的不同,它可能无法产生比真实的1-FPS大得多的视频视频。

为了测试这一点,我刚刚制作了一个真实的1-FPS视频,输出为2.24 kiB。然后,我制作了具有相同输入图像但以24 FPS输出的视频,结果为5.76 kiB。这是大小的两倍多,几乎是大小的24倍。:)


在-pix_fmt上+1。容易忘记,有些人坚持使用WMP :-)
Smalltown2k 2014年

为什么要在输入仅为1时将输出格式设置为10 fps?它不会创建完全相同的90%冗余帧吗?
赫伯特

@Herbert它会创建多余的帧,以便您可以将帧率提高到10,这样做是为了使VLC不会抱怨,并且它在视觉上不会更改视频。编码器足够聪明,可以看到所有帧都是相同的,因此您不会得到更大的文件
chiliNUT

@chiliNUT很清楚,关键帧不是所有格式,但大多数理智的格式都可以。谢谢!
赫伯特

5

同时使用-framerate-r

例如,制作一个看起来像1FPS的最终视频:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

这类似于以1 FPS将PNG帧转换为视频的过程| Unix&Linux Stack Exchange说,但是我需要-framerate代替-r它才能工作。

Wiki上提到了这一点:http : //trac.ffmpeg.org/wiki/Slideshow#Framerates

它将30VLC可以处理的输出帧速率设置为,并复制每个图像30次,以使输出视频看起来为1 FPS。另请参阅:使用ffmpeg的图像中的低fps视频在VLC中的播放问题| 堆栈溢出

然后VLC可以正常播放视频。

ffmpeg具有10个PNG的目录中的Ubuntu 16.10,VLC 2.2.4、3.0.5上进行了测试。

另请参阅:https : //stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg


-r和之间有什么区别-framerate
Royi

@Royi我真的不知道,除了那是唯一对我有用的东西:-)但是,如果您设法从man页面中提取它,请告诉我;-)有意义的引号是“ -r as a输入选项,忽略存储在文件中的所有时间戳,而是假设帧速率为fps,则生成时间戳。这与用于某些输入格式(如image2或v4l2)的-framerate选项不同(以前与旧版本的FFmpeg)。如有疑问,请使用-framerate而不是输入选项-r。”
Ciro Santilli新疆改造中心法轮功六四事件

3

如果您稍微扩展一下第二个示例,该怎么办:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

-r 1需求来的.png文件之前,而不是之后。

FFmpeg文档中

通常,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后,将每次出现都应用于下一个输入或输出文件。


不幸的是,这不起作用。但是,提到订单很重要,为我节省了很多时间。谢谢。
Mohammed Noureldin

0

这是VLC中的错误(在3.0.6版中仍然存在)。经过一些实验,我意识到对于FPS小于10的视频VLC会崩溃。因此,所有10 FPS或更高的视频都不会成为问题。因此,目前尚没有一种干净的方法来获得在VLC中可播放的具有1 FPS的视频(不要放弃,继续阅读)。

一种解决方法是-如上面的答案所示-通过复制图像来伪造1 FPS的效果(当我们实际上具有等于或大于10的FPS时,对于VLC来说是可以的)。

例如:如果您有一个包含12张图像的文件夹,并且想要生成一个具有1 FPS的视频(在VLC中可以播放),则需要将每个图像重复多次(比如说10次),然后告诉FFMPEG生成10 FPS视频。这样,我们将获得一个总帧数为120的视频,其中每个图像将播放1秒钟(由于重复10次),这对于1 FPS来说简直是假货。

我更喜欢使用fps参数,而不是-r(在另一个答案中显示)参数(在某些情况下可能会出现问题)(根据官方文档)。

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

由于输入-framerate低于输出fps,因此FFMPEG将复制帧以达到所需的输出帧速率(根据上面的命令为10)。

这也是以通知重要的是顺序-framerate-vf fps是重要,因为这种配置将被应用到下一个上述视频(输入或输出)。那是根据官方文档

选项将应用于下一个指定的文件。因此,顺序很重要...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.