3

いくつかの mp4 ファイルをバッチ変換するためのこの bash スクリプトがあります。

#!/bin/bash
ls dr*.mp4 | grep -v -E "\.[^\.]+\." | sed "s/.mp4//g" | while read f 
do
    TARGET="$f.ffmpeg.mp4"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg  -nostdin -i $f.mp4 -s 320x180 -vc h264 -acodec copy -f mp4 -y $TARGET
    fi

    TARGET="$f.ffmpeg.flv"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg  -nostdin -i $f.mp4 -s 320x180 -acodec copy -y $TARGET
    fi

    TARGET="$f.jpg"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg -nostdin -i $f.ffmpeg.mp4 -ss 0 -vframes 1 -f image2 $TARGET
    fi

    TARGET="$f.ffmpeg.ogv"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg  -nostdin -i $f.mp4 -s 320x176 -ar 11025 -acodec libvorbis -y $TARGET
    fi
done 

一度実行されますが、入力ファイル名を 4 つの異なる形式に変換しますが、次の入力ファイル名にループしません。さまざまな変換の順序をシャッフルしようとしましたが、それでもスクリプトは 1 つのファイル名に対して 1 回だけ実行されます。-nostdin フラグを付けて ffmpeg を実行しようとしましたが、

"Unrecognized option 'nostdin'"

ffmpeg バージョンは ffmpeg バージョン 0.10.6-6:0.10.6-0ubuntu0jon1~lucid2 です - http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntuから ffmpeg パッケージを更新しただけで、新しいバージョンが見つかりません. ベースシステムは

Distributor ID: Ubuntu 
Description:    Ubuntu 10.04.1 LTS 
Release:        10.04 
Codename:       lucid
4

2 に答える 2

1

while ループで同じ問題に遭遇しました。これ-nostdinは、ffmpeg コマンドの 1 つでフラグが欠落していたためです。readそこにffmpegコマンドがあると、標準入力から読み取るため、データの一部が食べられていると思います。私の場合、while ループは次のようになりました。

find /tmp/dir -name '*-video' | while read -r file; do
    # note: I forgot -nostdin on the ffmpeg command
    ffmpeg -i "$file" -filter:v "amazing_filtergraph" out.mp4
done

そして、見つからないというエラーが表示tmp/dir/1-videoされます (先頭のスラッシュがパスにないことに注意してください)。追加-nostdinしたらすぐに問題は解決しました。

また、while ループでは、ほぼ常に-rフラグを使用する必要があることに注意してください。そうしないと、予期しない改行の継続が発生する可能性があります。

于 2015-09-12T04:24:16.763 に答える