首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ffmpeg concat:“不安全文件名”

ffmpeg concat:“不安全文件名”
EN

Stack Overflow用户
提问于 2016-08-17 12:39:51
回答 4查看 80.2K关注 0票数 127

试图将一堆mts-文件转换为一个大的MP4文件:

代码语言:javascript
复制
stephan@rechenmonster:/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV$ ~/bin/ffmpeg-git-20160817-64bit-static/ffmpeg -v info -f concat -i <(find STREAM -name '*' -printf "file '$PWD/%p'\n") -deinterlace -r 25 -s hd720 -c:v libx264 -crf 23 -acodec copy -strict -2 ~/tmp/Videos/20151222.mp4
ffmpeg version N-81364-gf85842b-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.1 (Debian 5.4.1-1) 20160803
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --enable-libass --enable-gnutls --enable-libvidstab --enable-libsoxr --enable-frei0r --enable-libfribidi --disable-indev=sndio --disable-outdev=sndio --enable-librtmp --enable-libmfx --enable-libzimg --cc=gcc-5
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 53.100 / 57. 53.100
  libavformat    57. 46.101 / 57. 46.101
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 51.100 /  6. 51.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
[concat @ 0x56054a0] Unsafe file name '/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV/STREAM'
/dev/fd/63: Operation not permitted

有什么不对吗?在这种情况下,“不安全文件”一词意味着什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-17 14:24:06

@Mulvya的回答(谢谢!)作品:“在-safe 0之前添加-i”。

然后,find STREAM -name '*' -printf "file '$PWD/%p'\n"出现了另一个问题,它将空路径作为第一个条目返回。

我为for f in ./*.wav; do echo "file '$PWD/$f'"; done (请参阅https://trac.ffmpeg.org/wiki/Concatenate)更改了它,现在它似乎起作用了。万岁!

票数 110
EN

Stack Overflow用户

发布于 2019-05-07 19:50:28

要回答为什么,我们需要看到ffmpeg的演示程序的操作,它从输入文件中读取多媒体流。在本例中,我们使用的是"concat",有以下选项:(存档文件)

此演示程序接受以下选项: safe如果设置为1,则拒绝不安全的文件路径。如果文件路径不包含协议规范,并且是相对的,并且所有组件只包含便携字符集中的字符(字母、数字、句点、下划线和连字符),并且在组件的开头没有句点,则认为文件路径是安全的。 如果设置为0,则接受任何文件名。 缺省值为1。 -1等于1,如果格式被自动探测,则为0。

结果是,find .在文件前面放置了一个./。如果您不想使用在unix中如何脱去前导"./“查找?,请参阅-safe 0获取解决方案。

票数 29
EN

Stack Overflow用户

发布于 2019-08-18 17:52:53

在我的例子中,双引号会导致错误。

我使用ffmpeg -f concat -i concat.txt -c copy output.m4a命令,concat.txt包含要连接的输入文件列表。

不安全文件名(双引号将文件名视为文件名的一部分,-safe 0无法修复此问题):

代码语言:javascript
复制
file "song1.m4a"
file "song2.m4a"

安全文件名(单引号):

代码语言:javascript
复制
file 'song1.m4a'
file 'song2.m4a'

安全文件名(没有引号):

代码语言:javascript
复制
file song1.m4a
file song2.m4a

上面的单引号、和没有引号的只有在只包含https://stackoverflow.com/a/56029574/1074998的情况下才安全。因此,下列常见文件名将无法工作:

  • 空格
  • 字形
  • /(路径)
  • 前缀周期(隐藏文件)

对于这种情况,您仍然需要-safe 0

[关于引证和逃逸的警告]

在文件名' 部分,总是需要转义。原因是file Im' .avi会自动将闭幕式引号添加到Im' .avi'中,这与file Im' .avi'相同。file Im' .avi''''''中的最后一个奇数引号也将添加结束引号为file Im' .avi''''''',因此不存在No such file or directory错误。我发现了这一现象,因为空间不再需要用\在前缀后转义单引号,而不必添加闭幕式引号。

尽管如此(必须由\转义\而不是用"转义),的转义样式类似于shell。如果文件名包含单引号,则可以使用I\'m\ .m4a(不被单引号包围)样式转义它,也可以使用'I'\''m .m4a''I'\''m'\ '.m4a'(被单引号包围)样式转义,但不能使用'I\'m\ .m4a''I'm .m4a'

在测试ffmpeg时,请注意第一行的错误消息可能会误导(文件确实存在),您需要检查第二行,即No such file or directory(文件不存在)或Invalid data found when processing input(无效媒体文件)。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38996925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档