Используйте php-скрипт для запуска конвейера gstreamer с помощью pulsesrc

#php #gstreamer #nvidia-jetson-nano

Вопрос:

Я пытаюсь выполнить конвейер gstreamer с помощью php-скрипта. Мне удалось заставить тестовый конвейер работать без каких-либо ошибок. Но когда я пробую нижеприведенный конвейер в php-скрипте, я получаю ошибку от элемента pulsesrc.

$output = shell_exec('sudo /usr/bin/gst-launch-1.0 -e v4l2src device=/dev/video1 ! tee name=t1 t1. ! queue ! video/x-raw, width=1920, height=1080, framerate=30/1 ! nvvidconv ! queue ! nvv4l2h264enc maxperf-enable=1 bitrate=4000000 profile=4 ! queue ! h264parse ! queue ! mux. pulsesrc device="alsa_input.usb-VXIS_Inc_ezcap_U3_capture-02.analog-stereo" ! queue ! audio/x-raw,width=16,depth=16,rate=44100,channel=1 ! audioconvert ! voaacenc ! aacparse ! mpegtsmux name=mux ! filesink location=feed1TS.ts t1. ! queue ! video/x-raw, width=1920, height=1080, framerate=30/1 ! nvvidconv ! queue ! "video/x-raw(memory:NVMM),width=959,height=540,framerate=30/1,format=NV12" ! queue ! nvoverlaysink overlay-x=0 overlay-y=270 overlay-w=959 overlay-h=540 overlay=1 v4l2src device=/dev/video0 io-mode=2 do-timestamp=true ! tee name=t2 t2. ! queue ! image/jpeg,width=1920,height=1080,framerate=30/1 ! videorate ! image/jpeg,width=1920,height=1080,framerate=30/1 ! nvv4l2decoder mjpeg=1 ! nvvidconv ! video/x-raw,width=1920,height=1080,framerate=30/1 ! nvvidconv ! queue ! "video/x-raw(memory:NVMM),framerate=30/1,format=NV12" ! nvv4l2h264enc maxperf-enable=1 bitrate=4000000 profile=4 ! queue ! h264parse ! queue ! mpegtsmux ! filesink location=feed2TS.ts t2. ! queue ! image/jpeg,width=1920,height=1080,framerate=30/1 ! nvv4l2decoder mjpeg=1 ! nvvidconv ! video/x-raw,framerate=30/1 ! nvvidconv ! queue ! "video/x-raw(memory:NVMM),framerate=30/1,format=NV12" ! queue ! nvoverlaysink overlay-x=960 overlay-y=270 overlay-w=960 overlay-h=540 overlay=2 2>amp;1 amp;');

Ниже приведена ошибка

 Setting pipeline to PAUSED ...
Opening in BLOCKING MODE 
Opening in BLOCKING MODE 
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstPulseSrc:pulsesrc0: Failed to connect: Connection refused
Additional debug info:
pulsesrc.c(1015): gst_pulsesrc_open (): /GstPipeline:pipeline0/GstPulseSrc:pulsesrc0
Opening in BLOCKING MODE 
Setting pipeline to NULL ...
Freeing pipeline ...
 

Поэтому я попробовал тот же трубопровод без элемента pulsesrc, тогда трубопровод работает идеально

$output = shell_exec('sudo /usr/bin/gst-launch-1.0 -e v4l2src device=/dev/video1 ! tee name=t1 t1. ! queue ! video/x-raw, width=1920, height=1080, framerate=30/1 ! nvvidconv ! queue ! nvv4l2h264enc maxperf-enable=1 bitrate=4000000 profile=4 ! queue ! h264parse ! queue ! mpegtsmux ! filesink location=feed1TS.ts t1. ! queue ! video/x-raw, width=1920, height=1080, framerate=30/1 ! nvvidconv ! queue ! "video/x-raw(memory:NVMM),width=959,height=540,framerate=30/1,format=NV12" ! queue ! nvoverlaysink overlay-x=0 overlay-y=270 overlay-w=959 overlay-h=540 overlay=1 v4l2src device=/dev/video0 io-mode=2 do-timestamp=true ! tee name=t2 t2. ! queue ! image/jpeg,width=1920,height=1080,framerate=30/1 ! videorate ! image/jpeg,width=1920,height=1080,framerate=30/1 ! nvv4l2decoder mjpeg=1 ! nvvidconv ! video/x-raw,width=1920,height=1080,framerate=30/1 ! nvvidconv ! queue ! "video/x-raw(memory:NVMM),framerate=30/1,format=NV12" ! nvv4l2h264enc maxperf-enable=1 bitrate=4000000 profile=4 ! queue ! h264parse ! queue ! mpegtsmux ! filesink location=feed2TS.ts t2. ! queue ! image/jpeg,width=1920,height=1080,framerate=30/1 ! nvv4l2decoder mjpeg=1 ! nvvidconv ! video/x-raw,framerate=30/1 ! nvvidconv ! queue ! "video/x-raw(memory:NVMM),framerate=30/1,format=NV12" ! queue ! nvoverlaysink overlay-x=960 overlay-y=270 overlay-w=960 overlay-h=540 overlay=2 2>amp;1 amp;');

Я также попытался использовать только конвейер pulsesrc для тестирования, как показано ниже.

 $output = shell_exec('sudo /usr/bin/gst-launch-1.0 -e pulsesrc device=alsa_input.usb-VXIS_Inc_ezcap_U3_capture-02.analog-stereo ! queue ! audio/x-raw,width=16,depth=16,rate=44100,channel=1 ! audioconvert ! vorbisenc ! oggmux ! filesink location=HW1.ogg 2>amp;1 amp;');
 

Он также не работает при вызове из php. Выход трубопровода показан, как показано ниже.

 Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstPulseSrc:pulsesrc0: Failed to connect: Connection refused
Additional debug info:
pulsesrc.c(1015): gst_pulsesrc_open (): /GstPipeline:pipeline0/GstPulseSrc:pulsesrc0
Setting pipeline to NULL ...
Freeing pipeline ... 
 

В чем может быть проблема и как я могу устранить эту ошибку в pulsesrc?

Все вышеперечисленные конвейеры отлично работают в командной строке.

Комментарии:

1. Скорее всего, ваш PHP-процесс запускается от имени пользователя, которому не разрешено подключаться к демону pulseaudio.

2. Я добавил следующее в файл sudoers, чтобы предоставить корневой доступ к сценарию. Сценарий выполняется на сервере nginx на том же устройстве www-данные ВСЕ=(ВСЕ) NOPASSWD: ВСЕ