Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471

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

20.09.2018, 15:23. Показов 2525. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2018, 15:23
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 3 минуты
Para bellum, Я понял что после заливки видео нужно как-то запустить задание на конвертацию.
Далее в БД нужно создать запись какую-то про это задание и поле со статусом иметь.(в редакторе средствами ajax отслеживать изменение этого поле, которое менять будет скрипт, когда конвертация закончится).
Основная проблема в том, как правильно создать этот скрипт с моей командой и как проверять его статус, чтобы еще потом можно было заносить изменения в БД... Так я смысл понял?
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
24.09.2018, 08:01  [ТС]
Para bellum, тема еще актуальна, прошу помощи. Очень надо разобраться. Вы хоть напишите у меня правильный ход мысли и это возможно?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
24.09.2018, 10:31
Лучший ответ Сообщение было отмечено 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
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
24.09.2018, 11:12  [ТС]
Para bellum, спасибо за пример. Смысл понятен.
Т.е в вашем примере скрипт запускается один раз на сервере через консоль и постоянно работает с интервалом между итерациями в 5 минут?
Про то что пользователю выводить индикацию что конвертирование идет это однозначно делать и это не проблема аяксом получать статус из БД и дальше пользователю выводить что надо.
Тут вопрос созревает такого плана, что если пользователь загрузил видео, а скрипт конвертации приостановлен на 5 минут (только что был запуск) то он будет ожидать 5 минут пока видео не начнет конвертироваться+само время на конвертацию?
Да и еще... Запускать конвертацию сразу нескольких видео одновременно, боюсь что сервер ляжет.
Тут задумка не в массовом видео-хостинге, а просто небольшого файлового хранилища.
Оттуда и конечно задача запускать конвертирование видео сразу, а не по таймеру несколько одновременно

И вот еще что подумал... данная реализация это же все-равно php. Значит и запускать надо будет командой php файл? Тогда можно создать задачу в крон чтобы этот файл запускался с каким-то промежутком времени?
И опять же, если это будет php, то не будет ли скрипт возвращать ошибки, сбрасывать конвертирование, если оно слишком долго идет?
Цитата Сообщение от Para bellum Посмотреть сообщение
# Делаете запрос к базе на обновление статуса
Статус сменится после выполнения конвертации или сразу после старта задания?
Это чтобы понимать статус чего мы меняем.
Видео началось конвертироваться и чтобы избежать повторный запуск конвертации (если видео конвертируется дольше чем запуск итераций) мы ему устанавливаем статус что конвертация запущена.
Или это статус что конвертирование завершено?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
24.09.2018, 11:21
Цитата Сообщение от 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
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
24.09.2018, 11:23  [ТС]
Para bellum, Все понял. Я там успел дополнить еще свой ответ вопросами, в тот момент пока вы отвечали.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
24.09.2018, 11:25
Цитата Сообщение от MirDj Посмотреть сообщение
если это будет php, то не будет ли скрипт возвращать ошибки, сбрасывать конвертирование, если оно слишком долго идет?
Не будет, в консоли время не ограничено по умолчанию (см. документацию).
Цитата Сообщение от MirDj Посмотреть сообщение
Статус сменится после выполнения конвертации или сразу после старта задания?
После выполнения, так как в документации написано:
Цитата Сообщение от php.net
Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.
Цитата Сообщение от MirDj Посмотреть сообщение
Или это статус что конвертирование завершено?
В данном случае -- что завершено. Но реализовать можно как угодно, и до и после запуска писать статус.
1
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
24.09.2018, 11:29  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Не будет, в консоли время не ограничено по умолчанию
т.е даже ограничения на выполнение php не действуют такие как max_execution_time?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
24.09.2018, 11:32
Смотрите документацию, говорю же: http://php.net/manual/ru/featu... rences.php
Цитата Сообщение от php.net
PHP, выполняемый в консоли, как правило, используется для более широкого диапазона задач, чем обычные веб-скрипты. И так как они могут выполняться очень долго, то максимальное время выполнения неограничено.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2018, 11:32
Помогаю со студенческими работами здесь

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

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

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

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

Ведение лога и просмотр в реальном времени
есть скрипт, он постоянно работает, у него нет интерфейса, делает работу и ведет лог (log.txt) и теперь мне нужен еще один скрипт, чтобы...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru