FFmpeg png 文件名中存在特殊字符“@”的问题

FFmpeg png 文件名中存在特殊字符“@”的问题

当我尝试从文件名中包含 @ 的多个 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]

相关内容