Я работаю над проектом по созданию фотокабины. У меня есть камера (canon 550d) и компьютер с сенсорным экраном (работает под управлением Ubuntu), который показывает веб-страницу, которую я написал.
я использую gphoto2 управлять моей DSLR изнутри веб-страницы, используя exec()
Я могу легко фотографировать.
Моя проблема в том, что я хочу также показать предварительный просмотр с камеры, прежде чем люди сделают снимок. Теперь у меня есть готовый скрипт, который открывает экземпляр MPlayer в окне без полей, которое также остается поверх всего, код находится в файле с именем live.sh
:
#!/bin/bash
gphoto2 --capture-movie --stdout > fifo.mjpg & mplayer -cache 32 -demuxer 35 -noborder -geometry 50%:100 -ontop 1 fifo.mjpg
в основном gphoto2 транслируется в fifo.mjpg, а затем MPlayer воспроизводит этот файл.
Все работает нормально и хорошо, когда я запускаю это из терминала:
bash live.sh
Это не работает, если я запускаю ту же команду из PHP
exec("bash live.sh", $output);
Посмотрите на результаты, которые я получаю при работе из этих двух сред
Запуск от терминала (ЭТО РАБОТАЕТ) :
MPlayer 1.2.1 (Debian), built with gcc-5.3.1 (C) 2000-2016 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing 1.
File not found: '1'
Failed to open 1.Playing fifo.mjpg.libavformat version 56.40.101 (external)
Capturing preview frames as movie to 'stdout'. Press Ctrl-C to abort.
*** Error ***
An error occurred in the io-library ('Could not claim the USB device'): Could not claim interface 0 (Device or resource busy). Make sure no other program (gvfs-gphoto2-volume-monitor) or kernel module (such as sdc2xx, stv680, spca50x) is using the device and you have read/write access to the device.
ERROR: Movie capture error... Exiting.
Movie capture finished (0 frames)
libavformat file format detected.
Cannot seek backward in linear streams!
Seek failed
[mjpeg @ 0x7f9cffecb540]Found EOI before any SOF, ignoring
[mjpeg @ 0x7f9cffecb540]Changeing bps to 8
[lavf] stream 0: video (mjpeg), -vid 0
VIDEO: [MJPG] 1056x704 0bpp 25.000 fps 0.0 kbps ( 0.0 kbyte/s)
Load subtitles in ./
Failed to open VDPAU backend libvdpau_va_gl.so: cannot open shared object file: No such file or directory
[vdpau] Error when calling vdp_device_create_x11: 1
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
libavcodec version 56.60.100 (external)
Selected video codec: [ffmjpeg] vfm: ffmpeg (FFmpeg MJPEG)
==========================================================================
Audio: no sound
Starting playback...
[mjpeg @ 0x7f9cffecb540]Found EOI before any SOF, ignoring
[mjpeg @ 0x7f9cffecb540]Changeing bps to 8
Could not find matching colorspace - retrying with -vf scale...
Opening video filter: [scale]
Movie-Aspect is undefined - no prescaling applied.
[swscaler @ 0x7f9d00c36fa0]bicubic scaler, from yuv422p to yuyv422 using MMXEXT
[swscaler @ 0x7f9d00c36fa0]using unscaled yuv422p -> yuyv422 special converter
VO: [xv] 1056x704 => 1056x704 Packed YUY2
Movie-Aspect is undefined - no prescaling applied.
VO: [xv] 1056x704 => 1056x704 Packed YUY2
V: 0.5 0/ 0 37% 14% 0.0% 0 0 50%
MPlayer interrupted by signal 2 in module: enable_cacheMPlayer interrupted by signal 2 in module: video_read_frame
[mjpeg @ 0x7f9cffecb540]overread 8
[mjpeg @ 0x7f9cffecb540]EOI missing, emulating
V: 0.6 0/ 0 36% 13% 0.0% 0 0 50%
Exiting... (Quit)
Несмотря на все ошибки, все работает на удивление хорошо.
Это вывод, который я получаю при запуске из exec () в PHP (ЭТО НЕ РАБОТАЕТ):
array(16) {
[0]=>
string(71) "MPlayer 1.2.1 (Debian), built with gcc-5.3.1 (C) 2000-2016 MPlayer Team"[1]=>
string(39) "Terminal type `unknown' is not defined."[2]=>
string(0) ""[3]=>
string(10) "Playing 1."[4]=>
string(0) ""[5]=>
string(0) ""[6]=>
string(18) "Playing fifo.mjpg."[7]=>
string(29) "Cache fill: 0.00% (0 bytes)"[8]=>
string(0) ""[9]=>
string(40) "libavformat version 56.40.101 (external)"[10]=>
string(33) "libavformat file format detected."[11]=>
string(39) "Cannot seek backward in linear streams!"[12]=>
string(42) "[mjpeg @ 0x7fb771bec540]Changeing bps to 8"[13]=>
string(38) "[lavf] stream 0: video (mjpeg), -vid 0"[14]=>
string(69) "VIDEO: [MJPG] 1056x704 0bpp 25.000 fps 0.0 kbps ( 0.0 kbyte/s)"[15]=>
string(20) "Load subtitles in ./"}
Если у кого-то есть идеи, как сделать эту работу, я буду очень благодарен.
Спасибо!
Попробуй заменить exec
с popen
а также фоновый вызов скрипта.
pclose(popen("bash live.sh > /dev/null &", 'r'));
Таким образом, код выполняется в оболочке, отделенной от php. Это может помочь работе MPlayer.
Других решений пока нет …