这是在 Ubuntu 18.04 上使用 ffmpeg 版本 3.4.4-0ubuntu0.18.04.1。
我想实现同样的目标使用 ffmpeg 创建包含 5 幅图像并带有淡入/淡出效果的视频(主要是“浸入黑色”,虽然我也想了解“交叉淡入淡出”) - 但是,我有很多文件,并且更愿意使用绝对路径,而且我担心如果我在命令行上列出每个文件,我会遇到一些命令行限制。
因此,我发现了这一点(带有淡入淡出效果的 ffmpeg 幻灯片):
...其中提到:
“A” 是每张图片显示的持续时间(以秒为单位)(不包括淡入淡出持续时间),“B”是淡入淡出持续时间(以秒为单位)。
ffmpeg -i IMG_%3d.jpg -vf zoompan=d=(A+B)/B:fps=1/B,framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 out.mp4
因此,我有这些图像:
$ ls /path/to/test_*.jpg | wc -l
249
我希望帧速率为 25 fps,每幅图像的持续时间(无淡入淡出):四分之一秒,0.25 秒(因此 6.25 帧,或下限为 6 帧),淡入淡出持续时间为 4 帧(因此 0.16 秒 @ 25 fps)。因此,我期望至少有 249*(6+4) = 2490 帧,或 25 fps 时为 99.6 秒。
这是图像的格式(来自手机相机):
$ mediainfo /path/to/test_IMG_11a.jpg
General
Complete name : /path/to/test_IMG_11a.jpg
Format : JPEG
File size : 1 001 KiB
Image
Format : JPEG
Width : 3 840 pixels
Height : 2 160 pixels
Color space : YUV
Chroma subsampling : 4:2:2
Bit depth : 8 bits
Compression mode : Lossy
Stream size : 1 001 KiB (100%)
因此,我尝试这个命令行:
ffmpeg -an -f image2 -pattern_type glob -i '/path/to/test_*.jpg' \
-vf 'fps=25,zoompan=d=(0.25+0.16)/0.16:fps=1/0.16,framerate=25:interp_start=0:interp_end=255:scene=100' \
-vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3 \
-y out.mp4
这会导致两个问题:
第一个问题是:
[swscaler @ 0x5582a63a4500] deprecated pixel format used, make sure you did set range correctly
Last message repeated 3 times
虽然我没有直接调用 scale,但显然它是隐含的,因为我看到https://trac.ffmpeg.org/wiki/colorspace:
YUV 到 RGB 或缩放需要 swscale。
帖子https://stackoverflow.com/questions/43038294/im-getting-error-deprecated-pixel-format-used-make-sure-you-did-set-range-corr注意此警告可以忽略。但是,我想纠正它;我发现:
但是如果使用swscale,你也必须自己设置范围,否则结果会不正确。
- 将 yuvj420p 转换为 yuv420p - 黑色级别问题?:ffmpeg使用颜色空间的“已解决”示例
...但我不知道如何为我的图像指定色彩空间
第二个问题:不确定是否与第一个问题有关,但上述命令的输出视频在帧 = 421 处停止 - 我可以看到,我的 249 张图像中的大多数都没有编码! Vlc 在输出视频中看到大约 16 秒 - 远低于我预期的 2490 帧或 99.6 秒。
那么,正确的命令行调用是什么,才能从具有淡入淡出效果的图像序列中获取幻灯片,而没有弃用警告并且所有图像都已编码?