0

ディレクトリ内にたくさんのビデオがあると仮定すると、/home/user/videos/awaiting_conversioncron を使用してこのようなスクリプトを実行し、各ビデオを別の形式にバッチ変換するにはどうすればよいでしょうか?

/bin/sh -c $'nice /usr/bin/ffmpeg -i \044'\'$'/home/user/videos/awaiting_conversion/video_file_1.mp4'\'$' -s \044'\'$'480x320'\'$' -vcodec libx264 -acodec libmp3lame -ab \044'\'$'64k'\'$' -vpre fast -crf \044'\'$'30'\'$' -ar \044'\'$'22050'\'$' -f flv -y \044'\'$'/home/user/videos/converted/video_file_1.flv'\'$''

上記のスクリプトは、1 回の変換では正常に機能しますが、次のようになります。

  1. ビデオの名前が静的/既知であることを前提としています (バッチ変換の場合はそうではありません)。
  2. 変換するビデオが 1 つしかないことを前提としています (そうでない場合もあります)。つまり、「ループ」はありません。
  3. 元のファイルを削除するのではなく、元のファイルをそのまま残します(これは、変換の重複を防ぐために起こりたいことです)。

/home/user/videos/awaiting_conversion最終的な問題は、ファイル名を変数として渡して、内部に存在する各ビデオに対してそのスクリプトを実行するにはどうすればよいかということです。

4

2 に答える 2

4

これをやってみてください:

#!/bin/bash

checkFile(){
    [[ -s $1 && -f $1 ]] && return 0 || return 1
}

mp42flv(){
    for arg; do
        checkFile "$arg" || continue
        /usr/bin/ffmpeg \
            -i "$arg" \
            -s '480x320' \
            -vcodec libx264 \
            -acodec libmp3lame \
            -ab '64k' \
            -vpre fast \
            -crf '30' \
            -ar '22050' \
            -f flv \
            -y "${arg%.*}.flv" ||
                echo >&2 "Error treating $arg"
    done
}

if [[ -t 0 ]]; then
    mp42flv "$@"
else
    while IFS= read -r a; do
        checkFile "$a" || continue
        mp42flv "$a"
    done
fi

使用法

  • グロブ付き./script.sh /home/user/videos/converted/video_file*.mp4
  • ファイル名付き./script.sh /home/user/videos/converted/video_file_01.mp4
  • パイプ経由の検索find /home/user/videos/converted -type f -name '*video*mp4' |./script.shスクリプトは の使用を検出しますSTDIN)
于 2013-03-28T00:32:58.003 に答える
1

このbasename場合、コマンドはあなたの友達です。パターンを使用できます...

VIDEOS = /home/user/videos
for srcfile in ${VIDEOS}/awaiting_conversion/*.mp4 ; do
    dstfile=${VIDEOS}/converted/`basename ${srcfile} .mp4`.flv
    convertcommand ${srcfile} ${dstfile}
done

basename は、ディレクトリを srcfile から取り除き、サフィックスも取り除きます。次に、新しいパスを先頭に追加し、新しいサフィックスを追加します。

古い srcfile を自動的に削除する場合は注意してください。おそらく、a) ffmpeg リターン コード、b) dstfile のファイル サイズが特定のサイズ以上である、c) 新しいファイルを自動的に再生して、すばやく表示してから制御できるようにするなど、いくつかのことを確認できます。品質が正しくない場合は、変換または何かの外に出ます。重複した変換を防ぎたいだけの場合は、ファイルを別のディレクトリに移動し、すべてが機能していることを確認したら削除することをお勧めします。

于 2013-03-28T00:49:56.207 に答える