2013-05-23 2 views
3

У меня есть этот Баш скрипт для пакетного преобразования некоторых mp4 файлов:Баш скрипт для преобразования FFmpeg не петля

#!/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 
+1

Что такое вывод 'ls dr * .mp4 | grep -v -E "\. [^ \.] + \." | sed "s/.mp4 // g" '? – slhck

ответ

2

Don't parse the Output of ls, вы можете использовать glob Бинг вместо. Вы должны также процитировать переменные для учета возможных пробелов в именах файлов:

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.

0

Я столкнулся с той же проблемой с циклом while, и это произошло потому, что я отсутствовал флаг -nostdin в одной из моих команд ffmpeg. Я думаю, потому что read читает со стандартного ввода, что с командой ffmpeg в нем есть некоторые данные. В моем случае, в то время как цикл был как:

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, иначе могут возникнуть неожиданные продолжения новой строки.

Смежные вопросы