shell脚本:如果路径或文件名中有空格,则ffmpeg不能读取参数或文件名

时间:2014-07-09 20:35:06

标签: bash ffmpeg

我目前正在开发OS X上的bash shell脚本,以获得定制的Pashua GUI /自动化软件包,使用后面的ffmpeg,转码视频,标记,压缩,上传他们,组织他们等等。到目前为止,一切都像魅力一样。

我现在的问题是,如果我在变量中使用变量,我就无法使ffmpeg获取其中包含空格的文件或路径。但是(我认为)这是必须的,以便让ffmpeg一次转码多个文件,具体取决于用户勾选的格式和复选框。

我制作了一个小例子片段,以便您可以看到我的困境。

路径或文件名中没有空格/效果很好:

#!/bin/bash

infile='/Users/nicolas/Desktop/MASTER_[DE]_Test_140626.mov'

gen_outfile () {
    outfile="${1/MASTER/TRANSCODE}"
    ffmpeg_cl="-s $2 -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -c:a aac -b:a 240k -strict -2 $outfile"
}

gen_outfile "$infile" 1920x1080

./ffmpeg_stat -i "$infile" $ffmpeg_cl

输出符合预期,文件名为" TRANSCODE_ [DE] _Test_140626.mov"

带空格的文件名变量 - 直接输入到ffmpeg:

这也有效,但对我来说并不实用,因为我需要选择可变数量的输出文件和动态生成的参数。

#!/bin/bash

infile_full='/Users/nicolas/Google Drive/encode-o-mat/MASTER_[DE] Test  140626.mov'

gen_outfile () {
    outfile="${1/MASTER/TRANSCODE}"
    ffmpeg_cl="-s $2 -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -c:a aac -b:a 240k -strict -2"
}

gen_outfile "$infile_full" 1920x1080

./ffmpeg_stat -i "$infile_full" $ffmpeg_cl "$outfile"

输出符合预期,文件名为" TRANSCODE_ [DE] Test 140626.mov"。 但这种方式不是一种选择。

这里不起作用!文件名被拆分并且不完整:

#!/bin/bash

infile_full='/Users/nicolas/Google Drive/encode-o-mat/MASTER_[DE] Test  140626.mov'

gen_outfile () {
    outfile="${1/MASTER/TRANSCODE}"
    ffmpeg_cl="-s $2 -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -c:a aac -b:a 240k -strict -2 $outfile"
}

gen_outfile "$infile_full" 1920x1080

./ffmpeg_stat -i "$infile_full" $ffmpeg_cl

Ffmpeg提供此错误:"无法为' / Users / nicolas / Google'" 找到合适的输出格式 当然。

这也不起作用!引用等:

./ffmpeg_stat -i "$infile_full" "$ffmpeg_cl"

如果我把$ ffmpeg_cl变量放在各种引号中,ffmpeg就不再理解这些参数了!这是一个示例输出:

"无法识别的选项1920x1080 -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -c:a aac -b:240k -strict -2 / Users / nicolas / Google Drive / encode-o-mat / TRANSCODE_ [DE]测试140626.mov'。 拆分参数列表时出错:找不到选项 转换失败!"

脚本可以使用空格处理路径和文件名非常重要,因为我无法更改该工具应该运行的环境。所有的想法和解决方案都非常受欢迎!

1 个答案:

答案 0 :(得分:2)

改为使用数组:

#!/bin/bash

infile_full='/Users/nicolas/Google Drive/encode-o-mat/MASTER_[DE] Test  140626.mov'

gen_outfile () {
    outfile="${1/MASTER/TRANSCODE}"
    ffmpeg_cl=(-s "$2" -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -c:a aac -b:a 240k -strict -2 "$outfile")
}

gen_outfile "$infile_full" 1920x1080

./ffmpeg_stat -i "$infile_full" "${ffmpeg_cl[@]}"

确保正确引用""周围的变量扩展参数。同时引用包含*?![]的任何参数。