ffmpeg 不适用于包含空格的文件名

Posted

技术标签:

【中文标题】ffmpeg 不适用于包含空格的文件名【英文标题】:ffmpeg not working with filenames that have whitespace 【发布时间】:2014-05-11 01:26:14 【问题描述】:

我正在使用 FFMPEG 来测量存储在 Amazon S3 存储桶中的视频的持续时间。

我已阅读 FFMPEG 文档,他们明确指出所有空格和特殊字符都需要转义,以便 FFMPEG 正确处理它们:

请参阅文档 2.1 和 2.1.1:https://ffmpeg.org/ffmpeg-utils.html

但是,当处理文件名包含空格的文件时,ffmpeg 无法呈现结果。

我尝试了以下方法,但没有成功

ffmpeg -i "http://s3.mybucketname.com/videos/my\ video\ file.mov" 2>&1 | grep Duration | awk 'print $2' | tr -d
ffmpeg -i "http://s3.mybucketname.com/videos/my video file.mov" 2>&1 | grep Duration | awk 'print $2' | tr -d
ffmpeg -i "http://s3.mybucketname.com/videos/my'\' video'\' file.mov" 2>&1 | grep Duration | awk 'print $2' | tr -d
ffmpeg -i "http://s3.mybucketname.com/videos/my\ video\ file.mov" 2>&1 | grep Duration | awk 'print $2' | tr -d

但是,如果我去掉文件名中的空格 - 一切都很好,视频的持续时间就会返回。

【问题讨论】:

如果您引用,请保持原样:ffmpeg -i "my video file.mov" 您应该:1.) 用空格引用整个名称,或 2.) 用 `\` 转义空格 - 不能同时使用。 感谢您的帮助 - 似乎这仅适用于 URL,而不适用于直接文件名。 IE:针对“file name.mov”运行 cmd 有效。但是,对“domain.com/videos/filename.mov”运行它不会。 Aaaah 那么您必须检查 URL 的编码方式。通常一个空格被转换成%20。只需用浏览器打开网址,查看地址栏中的内容即可。 @fedorqui 就是这样!如果您将评论转换为答案,我会这样标记。谢谢! 【参考方案1】:

如果你的文件名中有空格,只需引用它们:

ffmpeg -i "my video file.mov"

在 URL 中,不能有空格。很可能您必须用%20 替换每个空格,这样您就可以得到:

ffmpeg -i http://myurl.com/my%20video%20file.mov
                             ^^^     ^^^

【讨论】:

如果我不知道路径...示例。我正在从设备中获取视频的所有路径并显示在应用程序中..我不知道它们存储在哪个目录中..那么如何处理带有空格的文件名..看看这个..***.com/questions/31774778/… ..thanks @BhuvneshVarma 一般来说,总是用双引号引起来文件名,这样空格就不会破坏你的代码。 请检查我的类似问题..我试过双引号..***.com/questions/33149606/… @fedorqui 双引号在 android 中甚至对于文件名也不起作用。 @AkashKava 这很奇怪。【参考方案2】:

ffmpeg 使用 % 来定义一个模式并处理多个文件。例如,如果您的文件名是 URI 编码的,则必须使用“-pattern_type none”以避免 ffmpeg 的误解:

ffmpeg -pattern_type none -i file%20name.mp4

【讨论】:

【参考方案3】:

要使 ffmeg 与包含空格的文件名/路径一起使用,您应该: 1) 使用Pushd设置工作目录 2) 把你的文件名放在引号""


这是一个工作示例:

cls

REM ++++++++++++++++++++++++++
REM Cut an audio file by right-cliking it (works also on multiple selected audio)
REM 1) save this file
REM 2) open registry, browse to  Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\audio\shell. On the left panel, right-click on "shell" and select "New", then "Key". Type "Cut audio 5min". Right click on the newly created folder "Cut audio 5min" and select again "New" and then "Key". Type “command”. On the right pane, double-click the "(default)" value name and type the following:  "C:\Users\Me\Cut audio.cmd" "%1"
REM  optional: if you want an Icon : in the left pane, right click  "Cut audio 5min", and select String value, then in the right pane, rename the new value to Icon, then double click on it and past this "%SystemRoot%\\System32\\shell32.dll,186"     (; list icon: https://diymediahome.org/windows-icons-reference-list-with-details-locations-images/ )

REM 3) right click an audio file and select "Cut audio 5min": the chunks will be created in the same folder. 

REM because ffmpeg has trouble with path/filename with space, we set the working directory to the folder of the audio file and the we run the command not on a full path but just on the filename, with "" around it

REM get https://***.com/a/15568171/3154274
REM fullpath of rightclicked file %1
REM full path (letter drive + path ithout letter drive)    %~d1%~p1
REM filename (filename + extension)   %~n1%~x1 

REM https://windowsloop.com/split-mp3-files-with-ffmpeg/
REM ffmpeg -i "input_audio_file.mp3" -f segment -segment_time 300 -c copy output_audio_file_%%03d.mp3
REM 300= 5min chunk

REM ++++++++++++++++++++++++++


REM set working directory
Pushd %~d1%~p1

REM  to let the windows open cmd /k ffmpeg -i "%~n1%~x1" -f segment -segment_time 300 -c copy "%~n1"_%%03d.mp3
cmd /k ffmpeg -i "%~n1%~x1" -f segment -segment_time 300 -c copy "%~n1"_%%03d.mp3

【讨论】:

【参考方案4】:
for fileOne in *.mp4
do
  baseName=$(basename "$fileOne" .mp4) # "$fileOne" quotes are necessary because of special chars in it
  echo "input: " $fileOne
  echo "var: " $baseName
  echo "target: " $baseName".mp3"
  cp "$fileOne" "tmp.mp4"
  # ffmpeg problem with specialchars like whitespaces and '-'
  # ffmpeg -i \"$fileOne\" "$baseName..mp3"
  ffmpeg -i "tmp.mp4" "tmp.mp3"
  mv "tmp.mp3" "$baseName".mp3""
done
rm "tmp-mp4"

`只需重命名转换文件:)

【讨论】:

【参考方案5】:

正如许多人指出的那样,最好的选择是引用字符串。它适用于所有其他特殊字符。这是我找到的ffmpeg documentation page 的一些示例。我附上一个屏幕截图,以防万一将来不可用。

【讨论】:

【参考方案6】:

我通过“引用”包含文件路径的 arg 来解决它。在我的例子中,路径存储在 %1 参数中(它写在注册表中的引号下,被转义: \"%1\" )。我检索它(使用 PowerShell 脚本),只需使用 $arg (内置参数)。然后我用它来获取一些文件信息,例如:

# Get the File path:  
$FilePath = $args

# Get the complete file name:
$file_name_complete = [System.IO.Path]::GetFileName("$FilePath")

# Get File Name Without Extension:
$fileNameOnly = [System.IO.Path]::GetFileNameWithoutExtension("$FilePath")

# Get the Extension:
$fileExtensionOnly = [System.IO.Path]::GetExtension("$FilePath")

不要忘记 $FilePath 周围的引用。

然后你可以用它把音频文件分成5分钟的部分,就像这样:

ffmpeg -i $file_name_complete -f segment -segment_time 300 -c copy $fileNameOnly"_"%03d$fileExtensionOnly #

【讨论】:

【参考方案7】:

您正在使用视频 URL 进行输入,因此您需要对该 URL 进行编码,因为据我所知 CURLWGET 也需要对 URL 进行编码,例如 SPACE 变为 %20,如果您使用php 这样做:rawurlencode($video_url)

【讨论】:

以上是关于ffmpeg 不适用于包含空格的文件名的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::property_tree 读取 ini 文件不适用于 A.x 形式的子级

CSS不适用于包含的PHP文件

FFMPEG 命令不适用于 Android 10

复制不适用于包含音频/视频文件的 CouchDB 数据库

bindProcessToNetwork 不适用于 android 中的 ffmpeg

视频压缩不适用于 ffmpeg4android_lib 库