как запустить ffmpeg, только если он не запущен - PullRequest
1 голос
/ 05 июня 2019

У меня есть скрипт, который запускается каждые 10 минут, который заставляет ffmpeg работать снова и снова и действительно замедляет его.Я бы хотел запускать только один экземпляр за раз, чтобы фильмы быстрее появлялись на моем веб-сайте (а не сбивали мой сервер).

Вот мой код:

for i in MovieCategories/Category1/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done

for i in MovieCategories/Category2/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done
for i in MovieCategories/Category3/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done
for i in MovieCategories/Category4/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done

for i in MovieCategories/Category5/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done
for i in MovieCategories/Category6/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done
for i in MovieCategories/Category7/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done

for i in MovieCategories/Category8/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done
for i in MovieCategories/Category9/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done
for i in MovieCategories/Category10/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done

for i in MovieCategories/Category11/*/*.mkv;
  do name=`echo $i | cut -d'.' -f1`;
  echo $name;
  ffmpeg -n -i "$i" "${name}.mp4"; rm -v "${name}.mkv";
done

Я попытался объединить их в одну команду, чтобы немного помочь, но по какой-то причине он не совпадал с именами из разных каталогов и потерпел неудачу.В целом, моя главная цель - запускать только один фильм за раз.Если бы вы могли помочь закрепить это, это было бы бонусом.Фильмы перечислены следующим образом:

КиноКатегории /

  • Категория1 /

    • Кино1 /
      • Кино1.mp4
    • Movie2 /
      • Movie2.mkv
    • Movie3 /
      • Movie3.mp4
  • Категория2 /
    • Movie4 /
      • Movie4.mp4
    • Movie5 /
      • Movie5.mkv
    • Movie6 /
      • Movie6.mp4

Ана ...

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Вы также можете использовать pgrep, чтобы проверить, работает ли он.Это более прямой способ запуска ps и передачи его в grep:

следующим образом:

! pgrep ffmpeg > /dev/null && echo "not running"

Или, если вам требуется оператор if, конечно:

if ! pgrep ffmpeg ; then
    echo "not running"
fi

Это также соответствует процессам, где ffmpeg появляется где-то в имени процесса.Так что это также будет соответствовать процессам с именем blahffmpegblah.Предложение, в котором используется «ps | grep», имеет аналогичное поведение, кстати.но может также соответствовать процессам, которые включают ffmpeg где-то в командной строке (включая файлы и параметры, передаваемые в качестве аргументов).Если вам не нравится это поведение, вы можете использовать опцию -x:

if ! pgrep -x 'ffmpeg' ; then
    echo "not running"
fi
1 голос
/ 05 июня 2019

Вы можете проверить, работает ли ffmpeg с чем-то вроде:

#!/bin/bash
if ps aux | grep -i '[f]fmpeg' ; then
  echo "running"
else 
  echo "not running"
fi

Код выхода команды ps aux помещается в $ ?.Если это ноль, то ffmpeg работает.Если он не работает, он не будет равен нулю.Надеюсь, вы сможете адаптировать этот скрипт под свои нужды.

0 голосов
/ 05 июня 2019

Одним из решений является объединение видеофайлов - ffmpeg doc . Там не будет никаких задержек или каких-либо замедлений.

ffmpeg -i "concat: file1.mkv | file2.mkv | file3.mkv" -c copy output.mkv

Также есть возможность создавать видео из списка файлов - , например, . При использовании RegEx это будет идеальная автоматизация.

:: Create File List
for %%i in (*.mkv) do echo file '%%i'>> video_list.txt

:: Concatenate Files
ffmpeg -f concat -safe 0 -i video_list.txt -c copy output.mkv


PS : вы можете выполнять преобразования, такие как изменение разрешения или частоты кадров для видео, преобразование видео в новый формат и т. Д. И создание нескольких копий одного видео в выходном файле.

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