Каталог назначения сценария перекодировки bash VLC
Ну, у меня есть такой скрипт перекодировки:
#!/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,channel =2}: дубликат {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 не используются. Я переместил часть перекодировки в функцию для ясности.