Вызовите ffmpeg через PHP, но не ждите его - PullRequest
1 голос
/ 03 октября 2011

У меня есть скрипт загрузки, который обрабатывает загрузку файла, а затем вызывает exec (ffmpeg -i ......

Я звоню в ffmpeg 3 раза. Один для преобразования в mp4, один для преобразования в wemb и один для получения эскиза.

Проблема в том, что если следователь загружает ВСЕ свои кадры, он не хочет сидеть там и ждать, пока он конвертируется, прежде чем он сможет сделать что-то еще. Итак, как я могу отправить 3 команды и затем выйти из сценария?

Я также хочу запустить exec (rm -r / path / to / original), чтобы исходное видео было удалено, но, очевидно, мне нужно дождаться завершения конверсий, прежде чем его можно будет запустить

Ответы [ 5 ]

5 голосов
/ 03 октября 2011

Вы можете использовать символ амперсанда после команды, чтобы запустить его в фоновом режиме и сразу же получить приглашение (контроль).

Я предлагаю создать скрипт bash, подобный:

#!/bin/sh
ffmpeg -i $1 -ab 64k -vb 420k $1.mp4
ffmpeg -i $1 -ab 64k -vb 420k $1.webm

Затем запустите его из php как:

system ('myscript.sh tempfile &');

В следующем примере используется структура if, чтобы решить, использовать звук или нет.Первый параметр - это имя файла, если второй равен 0, то нет звука на mp4, если третий равен нулю, то нет звука на webm.

#!/bin/sh
if [ $2 -eq 0 ]
then
    ffmpeg -i $1 -an -vb 420k $1.mp4
else
    ffmpeg -i $1 -ab 64k -vb 420k $1.mp4
fi


if [ $3 -eq 0 ]
then
    ffmpeg -i $1 -an -vb 420k $1.webm
else
    ffmpeg -i $1 -ab 64k -vb 420k $1.webm
fi

Вы можете использовать его из PHPкак:

system ('myscript.sh ' . $tempfile . ' ' . (0 + $mp4sound) . ' ' . (0 + $webmsound) . ' &');

... но помните, что вы можете даже запустить файл PHP вместо шеллскрипта, например:

system ("php converter.php \"$tempfile\" \"$mp4sound\" \"$webmsound\" &');
1 голос
/ 03 октября 2011
  • Обрабатывать загрузку и преобразование файлов отдельно
  • После загрузки файла
  • Поместить в очередь на работу
  • Запускать задание cron, которое каждую минуту проверяет последнюю очередь +, если текущее задание завершено, и если да, то выполнить преобразование.
  • После конвертации выполните отсылку (/ path / to / original), чтобы удалить оригинальное видео
  • Обновление статуса задания

Не уверен, имеет ли это смысл, что-то, о чем я думаю лучше, чем ты делаешь все сразу. Добавьте немного больше работы, чтобы облегчить боль в груди

1 голос
/ 03 октября 2011

Попробуйте обработать все преобразования ffmpeg отдельно на одной странице. например: convert.php

После завершения загрузки. отправил скрытый запрос на convert.php? id = someid

в верхней части использования convert.php ignore_user_abort(TRUE); Процесс запустится, даже если пользователь закроет браузер. если пользователь не закрыт, эта страница все еще на этой странице со статусом обновления ответа ajax.

Я надеюсь, что это может помочь понять ..

0 голосов
/ 03 октября 2011

Если вы работаете в Linux, конечный амперсанд для вашей команды в вызове exec () запустит процесс в фоновом режиме.

Возможно, вы также хотите перенаправить вывод из ffmpeg в / dev / null

ffmpeg -i (...)  > /dev/null 2>&1 &

Тот же подход можно использовать для вызова сценария оболочки, если вы хотите очистить после преобразования.

0 голосов
/ 03 октября 2011

Возможно, вы можете переместить код, который выполняет преобразование, в скрипт, который вызывается заданием cron.

Например, пользователь может загрузить видео в каталог и, возможно, вставить запись в таблицу базы данных, которая содержит все неконвертированные видео.

Затем задание cron запускается каждые x минут, проверяет базу данных на наличие неконвертированных видео и затем преобразует их. После этого сценарий может удалить исходные видео и удалить строку из базы данных.

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