当我尝试从文件名中包含 @ 的多个 png 文件创建 mp4 视频文件时,我刚刚发现 ffmpeg 存在问题。
所以我打电话
ffmpeg_exe -y -f concat -i [email protected] -safe 0 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -c:v libx264 -crf 17 -pix_fmt yuv420p [email protected]
该txt文件的内容如下多行:
file '[email protected]'
duration 0.2
file '[email protected]'
duration 0.2
file '[email protected]'
duration 0.2
file '[email protected]'
duration 0.2
问题出在文件名中的“@”。如果我从文件名中删除@,并从txt文件中删除@,它就可以正常工作。
@ 对于 ffmpeg 来说有特殊含义。我该如何摆脱它?
谢谢
答案1
仔细查看后,正如您所怀疑的那样, 存在问题@
。这是因为文档被@
认为是不安全的(不属于字母、数字、句点、下划线和连字符字符集)
20.5.2 选项 该解复用器接受以下选项:
safe 如果设置为 1,则拒绝不安全的文件路径和指令。如果文件路径不包含协议规范且是相对的,并且所有组件仅包含可移植字符集中的字符(字母、数字、句点、下划线和连字符),并且组件开头没有句点,则认为文件路径是安全的。
如果设置为 0,则接受任何文件名。
默认值为 1。
文件名@
需要-safe 0
您所包含的指令。
但是,那-safe 0
需要在 之前。顺序很重要,因为 ffmpeg 会自动保留-i [email protected]
-safe 默认值为 1由于 ffmpeg 如何按顺序评估解复用器的选项和要处理的文件。
以下是使用 strace 运行该命令的一些示例输出。您会注意到,@
后面的 concat 似乎用于寻址特定内存,所以我相信这就是它在 ffmpeg 中被视为不安全的原因。
在-safe 0
错误的位置:
write(2, "\33[48;5;0m\33[38;5;207m[concat @ 0x"..., 50[concat @ 0x55f7ac3063c0] ) = 50
write(2, "\33[48;5;0m\33[38;5;196mUnsafe file "..., 82Unsafe file name '[email protected]'
与-safe 0
之前-i
:
write(2, "\33[48;5;0m\33[38;5;207m[concat @ 0x"..., 50[concat @ 0x5600e673a3c0] ) = 50
write(2, "\33[48;5;0m\33[38;5;226mDTS 144 < 86"..., 53DTS 144 < 86016
最后,我能够通过在(在 Linux 上测试)-safe 0
之前放置来成功运行您的咒语-i
$ ffmpeg -y -f concat -safe 0 -i [email protected] -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -c:v libx264 -crf 17 -pix_fmt yuv420p [email protected]