Запуск ffmpeg через PHP - PullRequest
       6

Запуск ffmpeg через PHP

0 голосов
/ 11 марта 2020

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

I ' У меня есть опыт в кодировании PHP, но у него нет опыта работы с командной строкой.

У нас есть выделенный сервер, и у меня есть хостинговая компания, чтобы установить для меня ffmpeg.

Поэтому я решил начать просто и медленно построить до конечной цели. Но я действительно борюсь. Я потратил пару дней, пробуя разные вещи с очень небольшим успехом.

Я нашел этот пост с несколькими отличными примерами https://superuser.com/questions/833232/create-video-with-5-images-with-fadein-out-effect-in-ffmpeg, но я не могу получить ни одного из них работать. Это заставляет меня думать, что я делаю что-то в корне неправильно.

Так что это работает для меня - я получаю симпатичное небольшое 30 se c видео слайд-шоу из 6 изображений, отображаемых в течение 5 секунд каждое:

$ffmpeg="/usr/bin/ffmpeg";
exec($ffmpeg.' -f concat -safe 0 -i input.txt -c:v libx264 -r 30 -pix_fmt yuv420p -y out.mp4 2>&1', $output);
var_dump($output);

и это input.txt

file /home/webvivre/public_html/videos/test/i1.jpg
duration 5
file /home/webvivre/public_html/videos/test/i2.jpg
duration 5
file /home/webvivre/public_html/videos/test/i3.jpg
duration 5
file /home/webvivre/public_html/videos/test/i4.jpg
duration 5
file /home/webvivre/public_html/videos/test/i5.jpg
duration 5
file /home/webvivre/public_html/videos/test/i6.jpg
duration 5

Но это (в основном взято из примера в ссылке выше - меняются только имена изображений и местоположение ffmpeg) не работает для меня:

$code="/usr/bin/ffmpeg -y -loop 1 -i i1.jpg -loop 1 -i i2.jpg -loop 1 -i i3.jpg -filter_complex \" [0:v]zoompan=z='min(zoom+0.0015,1.5)':d=125,trim=duration=5,blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))',setpts=PTS-STARTPTS[v0]; [1:v]zoompan=z='min(zoom+0.0015,1.5)':d=125,trim=duration=5,blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))',setpts=PTS-STARTPTS[v1]; [2:v]zoompan=z='min(zoom+0.0015,1.5)':d=125,trim=duration=5,blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))',setpts=PTS-STARTPTS[v2]; [v0][v1][v2] concat=n=3:v=1:a=0, format=yuv420p[v]\" -map '[v]' -c:v libx264 -pix_fmt yuvj420p -q:v 1 out.mp4 2>&1";
exec($code,$output);
var_dump($output);

Это вывод:

array(25) { [0]=> string(67) "ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers" [1]=> string(56) " built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-36)" [2]=> string(1147) " configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --extra-ldflags='-Wl,-z,relro ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect" [3]=> string(40) " libavutil 54. 31.100 / 54. 31.100" [4]=> string(40) " libavcodec 56. 60.100 / 56. 60.100" [5]=> string(40) " libavformat 56. 40.101 / 56. 40.101" [6]=> string(40) " libavdevice 56. 4.100 / 56. 4.100" [7]=> string(40) " libavfilter 5. 40.101 / 5. 40.101" [8]=> string(40) " libavresample 2. 1. 0 / 2. 1. 0" [9]=> string(40) " libswscale 3. 1.101 / 3. 1.101" [10]=> string(40) " libswresample 1. 2.101 / 1. 2.101" [11]=> string(40) " libpostproc 53. 3.100 / 53. 3.100" [12]=> string(38) "[mjpeg @ 0x183c720] Changeing bps to 8" [13]=> string(32) "Input #0, image2, from 'i1.jpg':" [14]=> string(61) " Duration: 00:00:00.04, start: 0.000000, bitrate: 33777 kb/s" [15]=> string(128) " Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1000x750 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc" [16]=> string(38) "[mjpeg @ 0x18427c0] Changeing bps to 8" [17]=> string(32) "Input #1, image2, from 'i2.jpg':" [18]=> string(61) " Duration: 00:00:00.04, start: 0.000000, bitrate: 41896 kb/s" [19]=> string(132) " Stream #1:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1000x750 [SAR 300:300 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc" [20]=> string(38) "[mjpeg @ 0x1849fa0] Changeing bps to 8" [21]=> string(32) "Input #2, image2, from 'i3.jpg':" [22]=> string(61) " Duration: 00:00:00.04, start: 0.000000, bitrate: 34776 kb/s" [23]=> string(132) " Stream #2:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1000x750 [SAR 300:300 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc" [24]=> string(81) "Cannot find a matching stream for unlabeled input pad 1 on filter Parsed_blend_10" }

И для справки, это информация, предоставленная мне хостинговой компанией после установки ffmpeg для меня:

svr01~ # ffmpeg
ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-36)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --extra-ldflags='-Wl,-z,relro ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Hyper fast Audio and Video encoder

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

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

У вас есть две основные проблемы:

  • Ваша версия ffmpeg сильно устарела.
  • Фильтру смешивания требуется 2 входа, но вы даете только 1.

Обновление

Ваш ffmpeg настолько стар, что вам не хватает тысяч обновлений и сотен исправлений ошибок и функций. Поэтому, прежде чем делать что-то еще, вы должны обновить, иначе вы можете потратить свое время на борьбу с уже исправленной ошибкой.

Для вашей ОС легко загрузить уже скомпилированную версию с johnvansickle.com, См. FAQ для инструкций по установке. Затем используйте правильный путь в вашем скрипте, чтобы указать на новый ffmpeg.

. Кроме того, вы можете следовать пошаговому руководству по компиляции на FFmpeg Wiki: RHEL / CentOS . Это предполагает, что ваш хост позволяет это, и у вас есть доступ к необходимым зависимостям компиляции.

Фильтр смешивания

Вы получаете фатальную ошибку в выводе stderr из ffmpeg:

Cannot find a matching stream for unlabeled input pad 1 on filter Parsed_blend_10

Это крипти c, но это означает, что вы даете каждому смешанному фильтру один вход, но смешивающемуся фильтру требуется два входа (верхний и нижний слои).

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

Фильтр xfade

Вместо этого используйте фильтр xfade:

Фильтр xfade новее, чем FFmpeg 4.2, поэтому обязательно загрузите версию ffmpeg с текущей git мастер ветка.

0 голосов
/ 11 марта 2020

Я не знаю о вашем хостинге, но я думаю, что у вас, возможно, есть две проблемы

  • Ошибка строки исправления, ваша команда не отформатирована или вам нужно больше атрибутов (попробуйте добавить -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' на ваш счет)

  • на вашем хостинге нет ffmpeg (но я вижу, что они есть) или недавнего ffmpeg

у меня есть никогда не видел ошибку Parsed_blend_10 для ffmpeg, когда я гуглю ее, если увлекаюсь только этим постом и git issus без ответа.

что вы можете сделать:

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

но, я думаю, даже если вам удастся это сделать, вам понадобится собственный сервер, потому что ffmpeg будет занимать много памяти на стороне сервера, wi sh хостинговая компания не может позволить вам использовать его свободно, поэтому они попросят вас обновить.

и, пожалуйста, попробуйте на своем собственном хосте (локально, прежде чем переходить на хост)

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