VLC bash 转码脚本目标目录

VLC bash 转码脚本目标目录

嗯,我有这样的转码脚本:

#!/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 特定的构造。为了清晰起见,我将转码部分移至函数。

相关内容