bash скриптът за преобразуване на ffmpeg не зацикля

Имам този 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 различни формата, но не преминава към следващото име на входния файл. Опитах се да разбъркам реда на различните преобразувания, но въпреки това скриптът се изпълнява точно веднъж за едно име на файл. Опитах се да стартирам ffmpeg с флага -nostdin, но той казва

"Unrecognized option 'nostdin'"

Версията на ffmpeg е ffmpeg версия 0.10.6-6:0.10.6-0ubuntu0jon1~lucid2 - току-що актуализирам пакета ffmpeg от http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu и не може да намери по-нова версия. Базовата система е

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

person Alex Monthy    schedule 23.05.2013    source източник
comment
Какъв е резултатът от ls dr*.mp4 | grep -v -E "\.[^\.]+\." | sed "s/.mp4//g"?   -  person slhck    schedule 25.05.2013


Отговори (2)


Не анализирайте изхода на ls, вместо това можете да използвате globbing. Трябва също да цитирате променливите си, за да отчетете възможни празни интервали в имената на файловете:

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

Що се отнася до грешката, която получавате, според ChangeLog опцията -nostdin е добавена в ffmpeg 1.0, така че трябва да актуализирате вашата ffmpeg инсталация от 0.1x на 1.0.x.

person Adrian Frühwirth    schedule 30.05.2013

Сблъсках се със същия проблем с цикъл while и това беше, защото ми липсваше флагът -nostdin на една от моите ffmpeg команди. Мисля, че тъй като 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 в противен случай могат да възникнат някои неочаквани продължения на нов ред.

person Doug Richardson    schedule 12.09.2015