Как я могу проанализировать вывод ffprobe и запустить ffmpeg в зависимости от результата? - PullRequest
1 голос
/ 03 апреля 2012

Поэтому у меня возникла невероятная проблема с созданием двоичного файла ffmpeg для Mac, который работает правильно для всех моих потребностей.У меня есть старая версия, которая без проблем работает с ремуксингом видео h264, но мне не хватает нужной библиотеки, а именно libspeex.Я построил более новую сборку, основанную на git ffmpeg, которая включает libspeex, но вылетает при попытке сделать ремукс h264 из файлов .flv с неправильными временными кодами (живые дампы из rtmpdump).Поэтому у меня есть два двоичных файла ffmpeg, каждый из которых выполняет половину того, что мне нужноВот что у меня есть в качестве текущего файла .command:

for f in ~/Desktop/Uploads/*.flv
do
/usr/local/bin/ffmpeg -i "$f" -vcodec copy -acodec libfaac -ab 128k -ar 48000 -async 1 "${f%.*}".mp4 && rmtrash "$f" || rmtrash "${f%.*}".mp4
done

Этот двоичный файл ffmpeg включает libspeex, поэтому он может декодировать аудио speex во входные файлы .flv.То, что я хочу сделать, это что-то вроде этого псевдокода (моя первая попытка псевдокода, так со мной!):

for f in ~/Desktop/Uploads/*.flv
do
ffprobe input.flv
    if Stream #0:1 contains speex
        ffmpeg-speex -i input.flv -acodec copy -async 1 output.m4a
    fi
ffmpeg-h264 -i input.flv -vcodec copy output.mp4
MP4Box -add output.mp4 -add output.m4a finaloutput.mp4
done

Возможно ли что-то подобное?Есть ли альтернативы?(Кто-нибудь хочет собрать мне ffmpeg для Mac с помощью libspeex, libfaac и libx264?; D) Все идеи приветствуются здесь!Спасибо.

1 Ответ

1 голос
/ 03 апреля 2012

Вы можете запустить grep на его выходе и проверить, нашел ли он желаемую строку:

for f in ~/Desktop/Uploads/*.flv; do
    if ffprobe ${f} 2>&1 | egrep 'Stream #0:1.+speex'; then
        ffmpeg-speex -i ${f} -acodec copy -async 1 ${f/%.flv/.m4a}
        SPEEX_ADD="-add ${f/%.flv/.m4a}"
    fi
    ffmpeg-h264 -i ${f} -vcodec copy ${f/%.flv/.mp4}
    MP4Box -add ${f/%.flv/.mp4} ${SPEEX_ADD} ${f/%.flv/-final.mp4}
done

Предполагая, что входной файл abc.flv, ffmpeg-speex выведет abc.m4a, ffmpeg-h264 выведет abc.mp4, а MP4Box выведет abc-final.mp4.

Редактировать: Исправлено на grep также на stderr; исправлена ​​проблема, при которой несуществующий файл .m4a мог быть передан MP4Box в качестве входных данных.

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