Ну, у меня есть такой скрипт транскодирования:

#!/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 ответ1

0

Если выходной каталог не существует, 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 конструкции не используются. Я переместил часть перекодировки в функцию для ясности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .