Я пытаюсь запустить mjpg-streamer через интерфейс swig / c / php на Raspberry Pi. Ранее два приложения успешно контролировались через swig / c / php:
В случае mjpg-streamer я использовал следующий код:
void stream(void) {
system("export LD_LIBRARY_PATH=/usr/local/lib/");
system("mjpg_streamer -o 'output_http.so -w /media/MINIUSB/dev/Control/www' -i 'input_raspicam.so -x 640 -y 480 -fps 15'");
}
и запускаем make как в случае с GPIO-элементами управления
swig -Wextra -php camera.i
gcc -fpic -c `php-config --includes` camera.c camera_wrap.c
gcc -shared camera_wrap.o camera.o -o camera.so
cp camera.so `php-config --extension-dir`
service lighttpd restart
Наконец, я запускаю ‘chmod 4755 /usr/local/lib/input_raspicam.so’ и ‘chmod 4755 /usr/local/lib/output_http.so’, как я это сделал, чтобы включить ‘i2cset’ и т. Д.
В этом примере я не использую /dev/video[0..n], возможно, это должно быть другое устройство.
Система работает под управлением raspbian jessie, php-5.6.14, php5- [dev, cli, cgi], lighttpd, swig-2.0.12. Согласно phpinfo (), модуль был успешно загружен.
Кто-нибудь знает, что происходит не так?
Я не думаю, что два вызова системы делают то, что, как вы надеетесь, они будут делать, когда выполняются таким образом. Экспорт первого вызова будет влиять только на среду процесса оболочки, порожденной для этого конкретного звонка system
. Следующий вызов system унаследует среду своего родителя, которая не будет изменена. Вместо этого вы можете сделать следующее:
system("LD_LIBRARY_PATH=/usr/local/lib/ mjpg_streamer -o 'output_http.so -w /media/MINIUSB/dev/Control/www' -i 'input_raspicam.so -x 640 -y 480 -fps 15'");
Который установит среду для процесса, который вызывает mjpg_streamer. Или еще лучше использовать putenv / setenv.
Поскольку вы используете PHP и просто вызываете систему, вам будет лучше использовать PHP shell_exec
или что-то подобное, поскольку в вашем C нет ничего, что PHP уже не может сделать (он просто вызывает для вас bash)
При создании приложения вы можете встроить rpath в .so с помощью gcc -Wl,-rpath,/usr/local/lib ...
вместо использования LD_LIBRARY_PATH.
Как отметил @Flexo, отдельная система () для установки переменной среды не повлияет на среду при последующих вызовах системы ()