Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 404
1

Заливка файла+конвертация видео в реальном времени

20.09.2018, 15:23. Просмотров 866. Ответов 12
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане.
На сайте администратор при помощи редактора bbcode создает новости.
Иногда требуется к новости прикрепить видеофайл с устройства.
Для этого реализована заливка файла средствами php+ajax+jquery - после заливки вернет в поле редактора уже готовый файл в виде плейера(см.скриншоты).
Заливка файла+конвертация видео в реальном времени


Заливка файла+конвертация видео в реальном времени


Заливка файла+конвертация видео в реальном времени

Проблема вся в том, что видеофайл нужно конвертировать(уменьшить его вес+адаптировать под различные устройства)
Делаю через:
PHP
1
exec('ffmpeg -y -i '.$src.' -map_metadata -1 -map 0:v:0 -vcodec h264 -pix_fmt yuv420p -vsync 1 -async 1 -color_primaries 1 -color_trc 1 -colorspace 1 -vf scale="\'w=if(gt(a,16/9),640,-2):h=if(gt(a,16/9),-2,360)\'" -crf 20 -preset medium -profile:v baseline -level 3.0 -maxrate 800k -bufsize 1200k -f mp4 -movflags +faststart '.$cat_uploads.'/'.$newfile.' 2>&1',$retRES);
Сейчас это реализовано все в одном (заливка+конвертирование - одним файлом php) и если конвертирование идет долго, то скрипт вернет ошибку 504.
Пробовал увеличивать лимит в php max_execution_time = 1000 но это не помогает, хотя
PHP
1
echo ini_get('max_execution_time');
возвращает указанное мной время.
Но тем не менее 504 выдается в среднем через 3 минуты после начала заливки файла.
Возможно nginx обрывает соединение, я вроде бы увеличил, но не знаю как проверить срабатывает это в реальности или нет
Bash
1
2
3
4
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @fallback;
                 fastcgi_read_timeout 1000;
}
Короче говоря, вопрос в том, как бы мне лучше реализовать все это дело?
Возможно как-то можно просто периодически посылать запросы какие-то пока не получишь нужный ответ(допустим скриптом отслеживать процесс конвертирования)?
Есть вариант отдельно конвертировать видео после заливки файла, но тогда функционал теряет свой смысл.
Ведь администратору удобно делать все в одном окне и то что видео само после всех процессов подгружается в редактор новости и администратору остается только нажать "Опубликовать новость".
Короче говоря, я жду от вас советов - прошу не проходите мимо ))
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2018, 15:23
Ответы с готовыми решениями:

data() php в реальном времени
Отображение реального времени и манипулирования подобным процессом. Часы с которыми можно...

Конвертация WAV файла в MP3
Здравствуйте, форумчане! Решаю такаю задачу, нужен совет: При загрузке на сайт файла wav он...

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

Уведомления в реальном времени на сайте
Вот смотрите, я, администратор, в своей панели добавляю новое оповещение, а у всех пользователей,...

Вывод данных в реальном времени
Здравствуйте. Подскажите как мне реализовать мою задумку. Хочу сделать динамический вывод...

12
BuPy7
Нет ТЗ - давай досвидания
741 / 371 / 64
Регистрация: 01.12.2011
Сообщений: 2,250
21.09.2018, 02:54 2
Нужно запустить другой процесс, где все это будет конвертироваться. Есть разные службы очередей, можно и без них самому реализовать через БД.
Ну, естественно, куда-то нужно лить статусы о ходе работы и слушать их. Опять же, через БД.
0
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 404
21.09.2018, 09:49  [ТС] 3
Цитата Сообщение от BuPy7 Посмотреть сообщение
Нужно запустить другой процесс, где все это будет конвертироваться
Я почему спрашиваю, потому что, к сожалению, не знаю как это делается. Возможно есть где-то какие-то примеры или вы сможете что-то подсказать куда копать и ка делать?
0
Para bellum
Эксперт PHP
4106 / 3053 / 986
Регистрация: 06.01.2011
Сообщений: 8,933
21.09.2018, 11:21 4
1) Загрузили видео, добавили в очередь задание (запись в MySQL, PostgreSQL, Redis и т.п.).
2) Нужен слушатель очереди (простой вариант: запуск команды с помощью cron; но запускать в виде daemon лучше).
3) В запускаемом скрипте выбираете задания и выполняете. Пишите статус задания куда-нибудь.
1
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 404
21.09.2018, 11:44  [ТС] 5
Para bellum, А есть какие-то примеры как вообще это все делается. Суть я понял, а вот с реализацией туго, потому как никогда с этим еще не сталкивался

Добавлено через 3 минуты
Para bellum, Я понял что после заливки видео нужно как-то запустить задание на конвертацию.
Далее в БД нужно создать запись какую-то про это задание и поле со статусом иметь.(в редакторе средствами ajax отслеживать изменение этого поле, которое менять будет скрипт, когда конвертация закончится).
Основная проблема в том, как правильно создать этот скрипт с моей командой и как проверять его статус, чтобы еще потом можно было заносить изменения в БД... Так я смысл понял?
0
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 404
24.09.2018, 08:01  [ТС] 6
Para bellum, тема еще актуальна, прошу помощи. Очень надо разобраться. Вы хоть напишите у меня правильный ход мысли и это возможно?
0
Para bellum
Эксперт PHP
4106 / 3053 / 986
Регистрация: 06.01.2011
Сообщений: 8,933
24.09.2018, 10:31 7
Лучший ответ Сообщение было отмечено MirDj как решение

Решение

1) Пользователь загружает видео, пишите данные о нём в БД и возвращаете ID записи.
2) Клиент обращается к серверу, чтобы проверить статус записи. Если конвертация завершена, сервер возвращает нужные данные.
3) Пишите примерно такой бесконечный скрипт:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
while (true) {
    # Выполняете запрос к базе данных на получение необработанных видео
    $videos = $db->query('SELECT `id`, `src` FROM `videos` WHERE `state` = 0');
 
    # Обходите массив видео
    foreach ($videos as $video) {
        # Выполняете exec-команду
 
        # Делаете запрос к базе на обновление статуса
        $stmt = $db->prepare('UPDATE `videos` SET `state` = 1 WHERE `id` = :id');
        $stmt->execute([':id' => $video['id']]);
    }
 
    # Приостановка действия на 5 минут
    sleep(300);
}
Запускаете в фоне через консоль (например, с помощью nohup, если Linux).
Если запустили и нужно изменить код, не забывайте убить текущий процесс.
Не забывайте, что процесс может умереть при перезагрузке системы и некоторых других обстоятельствах.

Видео может конвертироваться долго, поэтому нужно что-то придумывать в редакторе, чтобы пользователь понимал, чего ждёт.

P.S. Это, конечно, простой пример, для донесения сути. Можно на Github поискать нормальную реализацию системы очередей, которая сможет принимать любые задания, а не только по видеофайлам работать.
1
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 404
24.09.2018, 11:12  [ТС] 8
Para bellum, спасибо за пример. Смысл понятен.
Т.е в вашем примере скрипт запускается один раз на сервере через консоль и постоянно работает с интервалом между итерациями в 5 минут?
Про то что пользователю выводить индикацию что конвертирование идет это однозначно делать и это не проблема аяксом получать статус из БД и дальше пользователю выводить что надо.
Тут вопрос созревает такого плана, что если пользователь загрузил видео, а скрипт конвертации приостановлен на 5 минут (только что был запуск) то он будет ожидать 5 минут пока видео не начнет конвертироваться+само время на конвертацию?
Да и еще... Запускать конвертацию сразу нескольких видео одновременно, боюсь что сервер ляжет.
Тут задумка не в массовом видео-хостинге, а просто небольшого файлового хранилища.
Оттуда и конечно задача запускать конвертирование видео сразу, а не по таймеру несколько одновременно

И вот еще что подумал... данная реализация это же все-равно php. Значит и запускать надо будет командой php файл? Тогда можно создать задачу в крон чтобы этот файл запускался с каким-то промежутком времени?
И опять же, если это будет php, то не будет ли скрипт возвращать ошибки, сбрасывать конвертирование, если оно слишком долго идет?
Цитата Сообщение от Para bellum Посмотреть сообщение
# Делаете запрос к базе на обновление статуса
Статус сменится после выполнения конвертации или сразу после старта задания?
Это чтобы понимать статус чего мы меняем.
Видео началось конвертироваться и чтобы избежать повторный запуск конвертации (если видео конвертируется дольше чем запуск итераций) мы ему устанавливаем статус что конвертация запущена.
Или это статус что конвертирование завершено?
0
Para bellum
Эксперт PHP
4106 / 3053 / 986
Регистрация: 06.01.2011
Сообщений: 8,933
24.09.2018, 11:21 9
Цитата Сообщение от MirDj Посмотреть сообщение
в вашем примере скрипт запускается один раз на сервере (не через php) и постоянно работает с интервалом между итерациями в 5 минут?
Запускается через PHP. Например:
PHP
1
/usr/bin/php /home/путь_к_скрипту.php
Где /usr/bin/php это путь к интерпретатору PHP-кода.
Да, задержка между проверками на наличие видео 5 минут (исключая время на саму конвертацию). Задержку можете вообще убрать, суть не в ней.
Цитата Сообщение от MirDj Посмотреть сообщение
Тут Вопрос созревает такого плана, что если пользователь загрузил видео, а скрипт конвертации приостановлен на 5 минут (только что был запуск) то он будет ожидать 5 минут пока видео не начнет конвертироваться+само время на конвертацию?
Да. Об этом думайте отдельно.
Цитата Сообщение от MirDj Посмотреть сообщение
Запускать конвертацию сразу нескольких видео одновременно, боюсь что сервер ляжет.
Зачем одновременно? По очереди они обходятся в foreach.
Второй начнёт конвертироваться сразу после завершения конвертации первого.
Цитата Сообщение от MirDj Посмотреть сообщение
Значит и запускать надо будет командой php файл?
Выше уже ответил.
Цитата Сообщение от MirDj Посмотреть сообщение
Тогда можно создать задачу в крон чтобы этот файл запускался с каким-то промежутком времени?
Нельзя. Такой запуск только вручную или с помощью специальных программ вроде Supervisor.
Cron назапускает кучу процессов, которые забьют ресурсы.

По Cron можно запускать, если убрать вечный цикл:
PHP
1
while (true)
И-то надо смотреть, чтобы при работе одного процесса не запускался второй.
1
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 404
24.09.2018, 11:23  [ТС] 10
Para bellum, Все понял. Я там успел дополнить еще свой ответ вопросами, в тот момент пока вы отвечали.
0
Para bellum
Эксперт PHP
4106 / 3053 / 986
Регистрация: 06.01.2011
Сообщений: 8,933
24.09.2018, 11:25 11
Цитата Сообщение от MirDj Посмотреть сообщение
если это будет php, то не будет ли скрипт возвращать ошибки, сбрасывать конвертирование, если оно слишком долго идет?
Не будет, в консоли время не ограничено по умолчанию (см. документацию).
Цитата Сообщение от MirDj Посмотреть сообщение
Статус сменится после выполнения конвертации или сразу после старта задания?
После выполнения, так как в документации написано:
Цитата Сообщение от php.net
Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.
Цитата Сообщение от MirDj Посмотреть сообщение
Или это статус что конвертирование завершено?
В данном случае -- что завершено. Но реализовать можно как угодно, и до и после запуска писать статус.
1
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 404
24.09.2018, 11:29  [ТС] 12
Цитата Сообщение от Para bellum Посмотреть сообщение
Не будет, в консоли время не ограничено по умолчанию
т.е даже ограничения на выполнение php не действуют такие как max_execution_time?
0
Para bellum
Эксперт PHP
4106 / 3053 / 986
Регистрация: 06.01.2011
Сообщений: 8,933
24.09.2018, 11:32 13
Смотрите документацию, говорю же: http://php.net/manual/ru/features.commandline.differences.php
Цитата Сообщение от php.net
PHP, выполняемый в консоли, как правило, используется для более широкого диапазона задач, чем обычные веб-скрипты. И так как они могут выполняться очень долго, то максимальное время выполнения неограничено.
1
24.09.2018, 11:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2018, 11:32

Сайт местоположение в реальном времени
Все доброго времени суток. У меня есть простое приложение на андроид которое например каждую...

Группа пользователей в реальном времени
Получается есть у пользователей группа. Она определяется в реальном времени. Тоесть к примеру...

Как сделать чат в реальном времени?
Основной вопрос: как сделать чат в реальном времени? Причем я подразумеваю не тот чат, который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru