Bash脚本中ffmpeg -i参数传入变量路径无法识别文件的异常问题
问题成因
这个问题和ffmpeg本身特性无关,是Bash的波浪号展开规则导致的:
- 波浪号
~只有在未被引号包裹、或者处于字符串开头且未被引号包裹时,才会被Bash自动展开为当前用户的家目录绝对路径 - 你的代码里把
~写在了双引号内部赋值给变量,Bash不会做展开,实际传递给ffmpeg的是字面量~/Downloads/ringtone.m4a,而非你期望的家目录下的真实路径 youtube-dl内置了对~路径的额外解析逻辑,所以即使收到带~的字面路径也能正常定位文件,但ffmpeg没有做这层兼容,只会按字面路径查找文件,因此触发找不到文件的报错
解决方案
1. 修正路径变量的写法
两种可选方案,优先推荐第二种兼容性更强:
- 方案1:变量赋值时不要将
~包裹在引号内
filepath_interim=~/Downloads/ringtone.m4a filepath_out=~/Downloads/ringtone.m4r
- 方案2:用
$HOME代替~,$HOME在双引号内也可以正常展开
filepath_interim="$HOME/Downloads/ringtone.m4a" filepath_out="$HOME/Downloads/ringtone.m4r"
2. 优化命令的变量引用
给所有变量包裹双引号,避免路径/参数包含空格、特殊字符时被Bash错误拆分:
youtube-dl -i --extract-audio --audio-format m4a -o "$filepath_interim" --audio-quality 0 "$video_link" ffmpeg -i "$filepath_interim" -acodec copy -f ipod -ss "$offset" -t "$length" "$filepath_out"
内容的提问来源于stack exchange,提问作者zeebrah
相关产品推荐
相关产品推荐

