我的问题的第一部分:
我读到ffmpeg 文档(section 3.2 How do I encode single pictures into movies?
) 下列:
要将单张图片编码成电影,请运行以下命令:
ffmpeg -f image2 -i img%d.jpg movie.mpg
请注意,“%d”被图像编号替换:img%03d.jpg 表示序列 img001.jpg、img002.jpg 等...
img%03d.jpg
我的问题是:谁在进行和之间的翻译img001.jpg, img002.jpg, etc
?是shell还是ffmpeg?
第二部分:
我想要求 ffmpeg 将图像序列编码成视频。然而,我的序列通常以不同于 1 的索引开始(例如我们可以称之为start_index
),并以我们可以称之为 的索引结束end_index
。此外,该序列使用 value 的增量increment
,例如:
img_0025.png, img_0030.png, img_0035.png, ... img_0100.png
其中start_index
25、100end_index
和increment
5。
我想将上面这样的图像序列提供给 ffmpeg,而不必先重命名该序列。该文档解释了如何使用符号链接来做到这一点,但我想知道是否有办法完全避免它们,也许在 zsh 上使用高级通配符。
答案1
第1部分: %
不是特殊字符,因此参数img%d.jpg
按原样传递给ffmpeg
“完成工作”本身。
第2部分:查看ffmpeg
文档,我认为没有其他方法可以提供输入文件,因此您可能必须使用符号链接或等待“修复”:
如果模式包含“%d”或“%0Nd”,则模式指定的文件列表的第一个文件名必须包含 0 到 4 之间的数字,所有后续数字必须是连续的。这个限制有望得到解决。
答案2
它可以仅使用管道来完成,即。无需重命名,也无需符号链接。
这是我整理的脚本、评论和所有内容。
我已将其设置为每秒 1 帧播放。
图像处理使用包netpbm
例如:images-to-vid '$HOME/images" '\./img_[0-9]{4}[^/0-9]*' 1024 768
# Make a video from images whose sizes and aspect-ratios may vary.
#
# Each image is resized to fit maximized within the video frame.
# The images are positioned centrally and padded (when required)
#
# Images are sourced using 'find'.
# They are selected according to a regular expression.
# Symbolic links are ignored.
#
# Output from 'find' is sorted by path, ie. not by name alone,
# but with a -maxlevel 1, this is typically the same...
# You will need to customize the sort if this is not suitable.
#
# Note about 'find':
# This script uses 'find -regex' instead of 'find -name'.
# The pattern must match the whole returned path,
# from ^ to $ inclusive
# The -regextype option is: posix-extended
#
srceD="${1}" # Source Directory
srceR="${2}" # Source imaage extended Regex pattern
targW="${3:-800}" # Target pixel Width
targH="${4:-600}" # Target pixel Height
targB="${5:-black}" # Target Background colour (X11 colours)
targM="${6:-4}" # Target screen geometry Modulo (as required by Target codec)
TARGw=$((targW-(targW%targM))); ((TARGw==targW)) || { echo "Target Width must be divisible by $targM. Rounding down to $TARGw" 1>&2 ; targW=$TARGw; }
TARGh=$((targH-(targH%targM))); ((TARGh==targH)) || { echo "Target Height must be divisible by $targM. Rounding down to $TARGh" 1>&2 ; targH=$TARGh; }
# TODO: test for W/H == 0
cd "$srceD" || exit 2
find . -maxdepth 1 \
\( -type f \) -and -not \
\( -type l \) \
-regextype posix-extended \
-regex "$srceR" \
-print0 |
sort -z |
{
while IFS= read -d $'\0' -r file ;do
# make Composite image on coloured Background
pnmcomp -align=center -valign=middle \
<(anytopnm "$file" 2>/dev/null |
pnmscale -xysize $targW $targH) \
<(ppmmake "$targB" $targW $targH)
done |
ffmpeg -r 1 \
-f image2pipe \
-vcodec ppm \
-i - \
-y -s ${targW}x${targH} \
-vcodec mjpeg \
images.avi
}
答案3
仅针对第一部分:由 ffmpeg 完成这项工作。 shell 不将该%d
字符串理解为文件名中的特殊模式。