diretório de destino do script de transcodificação VLC bash

0

Bem, eu tenho esse script de transcodificação:

#!/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

Mas quero colocar os arquivos de saída em outro diretório separado com o mesmo nome da origem. Por exemplo, se eu converter todos os arquivos da pasta

/usr/tmp/pop_music

Eu quero colocar arquivos convertidos no diretório

/$user/pop_music

Eu fiz todas as variações possíveis e sempre recebo erros. Com a variante atual (acima), recebo o erro:

[0xb500abe0] main stream out debug: destroying chain... (name=(null))
[0xb500abe0] main stream out debug: destroying chain done [0xb5000588] main stream output error: stream chain failed for 'transcode{acodec=vorb,ab=256,channels=2}:duplicate{dst=std{access=file,mux=ogg,dst="1/Alabama - If You're Gonna Play in Texas (You Gotta Have a Fiddle in the Band).ogg"}'
[0x95be4f8] main input error: cannot start stream output instance, aborting
[0x96985a8] main playlist debug: finished input
[0x96985a8] main playlist debug: dead input

Eu tentei especificar em dst:
1) 1 / XXX.ogg
2) /1/XXX.ogg
3) 1 \ XXX.ogg
4) \ 1 \ XXX.ogg
mas sem sorte ...

    
por Suncatcher 12.03.2014 / 19:37

1 resposta

0

Se o diretório de saída não existir, o VLC falhará com essa mensagem exata.

Esta é uma pequena expansão do script. No estado atual, ele pega diretórios como argumentos e faz um loop através deles. Se nenhum argumento for fornecido, ele procurará arquivos no diretório atual. Os arquivos de saída são gravados no diretório inicial, em um subdiretório nomeado como o diretório pai de cada arquivo fornecido. Os diretórios de saída são criados após a chamada para evitar a mensagem de erro.

#!/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

Muitas linhas, mas a maioria é apenas um código de placa de caldeira colada (sinta-se à vontade para perguntar se alguma parte não está clara). Eu mudei o interpretador para #!/bin/sh desde que nenhuma construção específica de Bash foi usada. Mudei a parte de transcodificação para uma função para maior clareza.

    
por 12.03.2014 / 21:35