применить ffmpeg ко многим файлам - PullRequest
3 голосов
/ 09 марта 2011

Я написал простой скрипт:

#!/bin/bash
find . -name "*.m4a" | while read filename;
do
    new_filename=$(echo "$filename" | sed "s/^\(.*\)m4a$/\1flac/g");
    if [ ! -f "$new_filename" ]
    then
            #ffmpeg -i "$filename" -acodec flac "$new_filename" > /dev/null 2>&1;
            #wait $!;
            echo "$filename";
            echo "$new_filename";
    fi
done

он выводит правильный результат:

./Equilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/04 - Met.m4a
./Equilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/04 - Met.flac
./Equilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/02 - Nach Dem Winter.m4a
./Equilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/02 - Nach Dem Winter.flac

, если раскомментировать ffmpeg и ждать:

./Equilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/04 - Met.m4a
./Equilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/04 - Met.flac
uilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/02 - Nach Dem Winter.m4a
uilibrium, ALAC [GER] viking.folk/2003 - Demo 2003, ALAC/02 - Nach Dem Winter.flac

И без флаговбыло сделано!

PS

#!/bin/bash
find . -name "*.m4a" | while read filename;
do
    new_filename=$(echo "$filename" | sed "s/^\(.*\)m4a$/\1flac/g");
    if [ ! -f "$new_filename" ]
    then
            ffmpeg -i "$filename" -acodec flac "$new_filename";
            echo "$filename";
            echo "$new_filename";
    fi
    sleep 5;
done

1) закодировать начало, но внезапно остановиться без сообщений об ошибках

2) закодировать не удалось из-за "uilibrium"из "./Equilibrium"

3) = 1)

4) = 2)

...

последняя) правильно

Ответы [ 4 ]

3 голосов
/ 09 марта 2011

неожиданно нашел решение:

#!/bin/bash
find . -name "*.m4a" | while read filename;
do
        new_filename=$(echo "$filename" | sed "s/^\(.*\)m4a$/\1flac/g");
        if [ ! -f "$new_filename" ]
        then
                ffmpeg -i "$filename" -acodec flac "$new_filename" &
                wait $!;
        fi
done

Не знаю почему, но если запустить процесс в фоновом режиме (&) и чем ждать его (wait $!), Все работает правильно!

1 голос
/ 30 июля 2015

Могу ли я предложить вам следующий параметр для ffmpeg.Он будет обрабатывать только текущий файл, прежде чем перейти к следующему файлу.

Параметр -nostdin в ffmpeg позволяет избежать попыток прочитать ввод пользователя из stdin, в противном случае интерпретируется сам видеофайл.

ffmpeg -i <filename> ... -nostdin

Лучшее в использовании вышеупомянутого - то, что вы можете продолжать использовать многословие:

ffmpeg -i <filename> ... -nostdin -loglevel panic 

ИЛИ, если вы предпочитаете сообщать вывод в файл, сделайте так:

# Custom log name (optional)
# FFREPORT=./${filename}-$(date +%h.%m.%s).log
ffmpeg -i <filename> ... -nostdin -report

Вы также можете использовать их комбинацию.

0 голосов
/ 20 марта 2011

Ой, просто, пожалуйста, упростите свой sed, это не исправит вашу ошибку, но будет более читабельным: -P

$ echo m4a.m4a | sed 's/m4a$/flac/g'
m4a.flac
0 голосов
/ 09 марта 2011

Я вижу две проблемы:

ffmpeg -i "$filename" -acodec flac "$new_filename" > /dev/null 2>&1;

Возможно, вы печатаете сообщение об ошибке, которое не видите, потому что вы делаете > /dev/null 2>&1, что отключит все ошибки.

И

wait $!

ничего полезного не сделает, потому что $! определяется только в том случае, если вы запускаете команду в фоновом режиме (т.е. что-то с &).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...