用于ffmpeg转换的bash脚本不循环

时间:2013-05-23 10:05:55

标签: bash loops ffmpeg stdin

我有这个bash脚本用于批量转换某些mp4文件:

#!/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种不同的格式,但不循环到下一个输入文件名。 我试图改变各种转换的顺序,但脚本仍然只运行一次文件名。 我尝试使用-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

2 个答案:

答案 0 :(得分:3)

Don't parse the Output of ls,您可以改用glob bing。您还应该引用变量来说明文件名中可能的空格:

for input in dr*.mp4; do
    output=${input%.mp4}.ffmpeg.mp4
    [ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -vc h264 -acodec copy -f mp4 -y "${output}"

    output=${input%.mp4}.ffmpeg.flv
    [ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -acodec copy -y "${output}"

    [...]
done

至于您获得的错误,根据-nostdin ffmpeg 1.0添加了ffmpeg选项,因此您需要从0.1x更新1.0.x安装} {{1}}。

答案 1 :(得分:1)

我遇到了与while循环相同的问题,这是因为我在我的一个ffmpeg命令上缺少-nostdin标志。我认为因为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循环中,您几乎always want to use the -r flag会发生一些意外的换行延续。