我想使用Makefile将一堆图像转换为视频(视频video1.mp4
是由文件video1/*.mjpg
生成的(。我试过了:
SOURCES=video1.mp4 video2.mp4
all: $(SOURCES)
%.mp4: $(shell find % -type f)
ffmpeg -framerate 24 -pattern_type glob -i '$*/*.jpg' -c:v libx264 -pix_fmt yuv420p $@
但它不起作用,%
没有变成类似video1
的前缀。知道如何让它工作吗?
您必须以另一种方式添加依赖项,因为%
确实没有按您希望的方式处理。像这样的东西(用一个足够的ffmpeg调用代替cat(应该可以做到:
DESTS=video1.mp4 video2.mp4
all: $(DESTS)
define add_dependencies
$(1): $(wildcard $(1:.mp4=)/*.jpg)
endef
$(foreach dst,$(DESTS),$(eval $(call add_dependencies,$(dst))))
%.mp4:
cat $^ > $@
注:
我使用内置通配符而不是find。按照我使用它的方式,我不会在子目录中递归,但你对ffmpeg的调用提示我这不是我想要的。
如果可能的话,我建议使用
$^
,而不是在ffmpeg中进行第二次文件匹配。这是针对GNU make的,但我认为其他make如果不以广泛的GNU make兼容性为目标,就不会接受
$(shell)
语法。