linux — завершить gstreamer из переполнения стека

У меня есть проблема с завершением gstreamer, который работает с php.

ОС: Ubuntu 16.04 LTS

Итак, чего я пытаюсь достичь:

Мне нужно начать / остановить запись видео из веб-интерфейса.

Я написал простой PHP-скрипт, который выполняет команду оболочки:

start.php

<?php
$cmd = "sudo gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! 'image/jpeg,  width=1920, height=1080, framerate=30/1' ! videorate ! queue ! mux. alsasrc device="plughw:CARD=Device" ! queue ! mux. avimux name=mux ! filesink location=test.avi"shell_exec($cdm);

Все работает нормально, пользователь apache sudoer, запись началась.

Но теперь мне нужно остановить запись:

stop.php

<?php
$cmd = "sudo killall gst-launch-1.0";
shell_exec($cmd);

И эта команда занимает слишком много времени, чтобы прекратить запись (около 33 секунд)

Когда я запускаю команду запуска (например, sudo gst-launch-1.0 -v -e v4l2sr ….) из командной строки, а затем нажимаю Ctrl + c — она ​​немедленно останавливается.

Даже если я пытаюсь убить процессы (есть несколько процессов с именем gst-launch-1.0) из командной строки (запись выполняется с помощью start.php), это также занимает примерно то же время (30-33 секунды).
Я пробовал различные команды: sudo killall gst-launch-1.0, посылая SIGINIT каждому pid с именем gst-launch-1.0, kill -9 каждый pid, но это не помогает.

Что я делаю неправильно?

Спасибо.

1

Решение

Вы записываете видео, с возможностью -e,
Эта опция заставляет GStreamer ждать до завершения своей задачи перед выходом, тем самым предотвращая повреждение файла.
В этом случае, когда вы убиваете gst-launch, из-за опции -e gst-launch будет ждать, пока записанные данные будут полностью записаны на диск. Это является причиной задержки 30-33 секунд.
(Задержка обычно увеличивается при длительной записи)

Такое поведение можно подавить, убив его дважды (или дважды Ctrl-C). Первое уничтожение (или Ctrl-C) вернет обычное поведение kill (Ctrl-C), таким образом, второе фактически уничтожит программу.
(Вы, вероятно, дважды нажимаете Ctrl-C, поэтому не видите 30-33 секундную задержку)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]