问题描述
我正在尝试使用avconv将一堆png转换为视频,png的编号类似于filename_<number>
所以我通常只使用命令:
avconv -r 10 -i filename_%d.png -b:v 1000k test.mp4
我现在想从filename_8
文件的一个子集制作一个视频 – filename_50
让我们说,所以我将这些文件复制到一个新目录并尝试相同的命令,但现在我收到错误:
filename_%d.png: No such file or directory
我认为这是因为编号不是从1开始的?
我怎样才能做到这一点?
最佳解决方案
avconv -r 10 -start_number 8 -i filename_%d.png -b:v 1000k test.mp4
对于-start_number
选项,您将需要最新的9.x版本的avconv;它不是0.8.x版本。或者,您可以使用最新版本的ffmpeg。或者将文件重命名为以0到4之间的数字开头,因为它将默认检查这些名称。
次佳解决方案
您可以使用cat连接文件,然后使用image2pipe demuxer在avconv中读取它们。喜欢cat filename* | avconv -f image2pipe -i - ...
第三种解决方案
看一下这个;根据ffmpeg,这是他们如何做它并且它的工作原理
-
首先,重命名图片以遵循数字序列。例如:
img1.jpg, img2.jpg, img3.jpg, ...
-
然后你可以运行:
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
请注意,
%d
由图像编号替换。img%03d.jpg
表示序列img001.jpg
,img002.jpg
等。 -
使用’-start_number’选项声明序列的起始编号。如果序列不是以
img001.jpg
开头但仍以数字顺序排列,则此选项非常有用。以下示例将以img100.jpg
开头:ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
-
如果要重命名大量图片,可以使用以下命令来减轻负担。该命令使用bourne shell语法,以符号方式将当前目录中与* jpg匹配的所有文件链接到
img001.jpg
,img002.jpg
等序列中的/tmp
目录。x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1));