嗯,我有这样的转码脚本:
#!/bin/bash
acodec="vorb"
arate="256"
ext="ogg"
vlc="/usr/bin/vlc"
fmt="mp3"
for a in *$fmt; do
$vlc -I dummy -vvv "$a" --sout "#transcode{acodec=$acodec,ab=$arate,channels=2}:duplicate{dst=std{access=file,mux=ogg,dst=\"${PWD##*/}/${a%%.*}.$ext\"}" vlc://quit
done
但我想将输出文件放在与源文件同名的其他单独目录中。例如,如果我将文件夹中的所有文件转换为
/usr/tmp/pop_music
我想将转换后的文件放在目录中
/$user/pop_music
我尝试了所有可能的变体,但总是出错。使用当前(上述)变体时,我遇到了错误:
[0xb500abe0] 主流输出调试:破坏链条... (name=(null))
[0xb500abe0] 主流输出调试:破坏链条完成 [0xb5000588] 主流输出错误:流链条因“transcode{acodec=vorb,ab=256,channels=2}:duplicate{dst=std{access=file,mux=ogg,dst="1/阿拉巴马州 - 如果你要在德克萨斯州演奏(你必须在乐队里有一把小提琴)。ogg"}'
[0x95be4f8] 主输入错误:无法启动流输出实例,正在中止
[0x96985a8] 主播放列表调试:完成输入
[0x96985a8] 主播放列表调试:输入无效
我尝试在 dst 中指定:
1) 1/XXX.ogg
2) /1/XXX.ogg
3) 1\XXX.ogg
4) \1\XXX.ogg
但没有成功...
答案1
如果输出目录不存在,VLC 将会失败并显示该确切消息。
这是对脚本的一个小扩展。在当前状态下,它将目录作为参数并循环遍历它们。如果没有给出参数,它会在当前目录中查找文件。输出文件将写入主目录,位于每个给定文件的父目录下的子目录下。输出目录是在调用时创建的,以避免出现错误消息。
#!/bin/sh
usage() {
cat <<-USAGE 1>&2
usage: ${0##*/} [DIR ...]
optional arguments:
DIR directories to search. Use current directory if none are given.
USAGE
exit 1
}
error() {
printf '%s: error: %s, aborting.\n' "${0##*/}" "$1" 1>&2
exit $2
}
transcode_dir() {
indir=$(readlink -f -- "$1")
outdir="$HOME/${indir##*/}"
! mkdir -pv -- "$outdir" && error "cannot create directory \"$outdir\"" 3
cd -- "$indir"
for a in *.$fmt; do
$vlc -I dummy -vvv "$a" --sout "#transcode{acodec=$acodec,ab=$arate,channels=2}:duplicate{dst=std{access=file,mux=ogg,dst=\"$outdir/${a%.*}.$ext\"}}" vlc://quit
done
cd - 2> /dev/null
}
while getopts "h" option; do
case $option in
h|\? ) usage;;
esac
done
shift $((OPTIND-1))
acodec="vorb"
arate="256"
ext="ogg"
vlc="/usr/bin/vlc"
fmt="mp3"
if [ $# -eq 0 ]; then
transcode_dir .
else
while [ $# -ge 1 ]; do
[ ! -d "$1" ] && error "not a directory: \"$1\"" 2
transcode_dir "$1"
shift
done
fi
有很多行,但大多数只是粘贴的样板代码(如果有任何不清楚的地方,请随时询问)。我将解释器更改为,#!/bin/sh
因为没有使用 Bash 特定的构造。为了清晰起见,我将转码部分移至函数。