video - 以 ffmpeg -i %04d.png 模式重复图像

标签 video ffmpeg

我正在制作一个 20 秒的视频,FPS=25,500 帧,0000.png , 0001.png , ..., 0499.png 。这有效:

ffmpeg -framerate 25 -i images/%04d.png out.mp4

但事实上,视频中只有一些变化,在我的例子中,帧为 0000、0122、0288、0312、0450。同时,PNG 是相同的.

问题:生成 500 个 PNG 文件总是很慢,而只需 5 个不同的文件就足够了!我只想生成这 5 个 PNG 文件,并从它们生成视频。

当我使用 images/ 尝试上面的命令时仅包含0000.png , 0122.png , 0288.png , 0312.png , 0450.png 而不是其他 495 个,显然它失败了:

[image2 @ 00000000006d4040] Could not open file : images/0001.png

问题:有没有办法告诉ffmpeg使用-i images/%04d.png时忽略丢失的帧并使用最新的可用帧而不是失败?

如果没有,有什么替代方案可以仅使用这 5 个 PNG 来生成应在精确时间范围内到达的视频?

最佳答案

方法一:concat过滤器

使用 -t 输入选项声明持续时间,然后与 concat filter 连接.

ffmpeg -loop 1 -framerate 25 -t 4.88 -i 0000.png -loop 1 -framerate 25 -t 6.64 -i 0122.png -loop 1 -framerate 25 -t 0.96 -i 0288.png -loop 1 -framerate 25 -t 00:00:05.52 -i 0312.png -filter_complex "[0][1][2][3]concat=n=4:v=1:a=0,format=yuv420p" output.mp4

方法2:concat demuxer

concat demuxer 中使用 duration 指令声明持续时间输入文件列表,然后使用 concat demuxer 连接。

这可能是最快的方法。

  1. 制作包含以下内容的 input.txt:

    file 0000.png
    duration 4.88
    file 0122.png
    duration 6.64
    file 0288.png
    duration 0.96
    file 0312.png
    duration 5.52
    
  2. 连接:

    ffmpeg -f concat -i input.txt -vf format=yuv420p output.mp4
    

方法3:修剪滤镜

此方法允许您以帧为单位声明持续时间(和/或如果您愿意,可以使用时间值)。

使用 trim filter 持续时间的帧的示例并与 concat filter 连接:

ffmpeg -loop 1 -framerate 25 -i 0000.png -loop 1 -framerate 25 -i 0122.png -loop 1 -framerate 25 -i 0288.png -loop 1 -framerate 25 -i 0312.png -filter_complex "[0]trim=start_frame=0:end_frame=121,setpts=PTS-STARTPTS[v0];[1]trim=start_frame=122:end_frame=287,setpts=PTS-STARTPTS[v1];[2]trim=start_frame=288:end_frame=311,setpts=PTS-STARTPTS[v2];[3]trim=start_frame=312:end_frame=449,setpts=PTS-STARTPTS[v3];[v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p" output.mp4

关于video - 以 ffmpeg -i %04d.png 模式重复图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66274201/

相关文章:

android - 从 iOS 到 Android 的点对点视频?

linux - gstreamer 保存的 .avi 视频在视频播放器中播放速度过快

video - 用 ffmpeg 合并多个视频文件并丢失任何轨道

OpenCV 不会从 RTMP 源捕获帧,而 FFmpeg 会

ffmpeg - 使用 ffms2 (ffmpegsource) 进行视频解码

html - 为网络视频添加注释

javascript - Node.js/Express 视频流(HTTP 206 部分内容)

ffmpeg - 过滤器有一个未连接的输出

video - 如何从 VLC 等视频播放器获取丢帧信息和播放视频的分辨率

java - OpenCV Java 从失败的文件中绑定(bind) VideoCapture