我目前正在开发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'。 拆分参数列表时出错:找不到选项 转换失败!"
脚本可以使用空格处理路径和文件名非常重要,因为我无法更改该工具应该运行的环境。所有的想法和解决方案都非常受欢迎!
答案 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[@]}"
确保正确引用""
周围的变量扩展参数。同时引用包含*
,?
,!
,[
和]
的任何参数。