Имитация Ctrl + C нажмите / отправить 'SIGINT' для дочернего процесса - PullRequest
0 голосов
/ 03 июня 2019

Что не так с этим кодом?Я пытаюсь отправить SIGINT дочернему процессу, чтобы позволить gst-launch-1.0 корректно завершить работу после завершения записи:

@pid = fork {
  exec("gst-launch-1.0 -e v4l2src device=/dev/video0 ! videoconvert ! vaapih264enc rate-control=vbr bitrate=10000 quality-level=4 keyframe-period=30 num-slices=1 refs=1 max-bframes=2 ! queue ! mux. alsasrc ! audio/x-raw,width=16,depth=16,rate=44100,channel=1 ! audioconvert ! audioresample ! voaacenc ! aacparse ! queue ! mp4mux name=mux ! filesink location='/tmp/test-010.mp4' sync=false")
}
sleep 5
puts 'Killing child process and waiting...'
Process.kill 'INT', @pid
Process.wait

Как видите, я выдаю Process.kill 'INT', @pid, что, насколько это возможнонасколько я знаю, это должно быть то же самое, что и нажатие ctrl+c при непосредственном запуске команды gst-launch-1.0 (или любой команды CLI).

Но вывод сценария Ruby таков:

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Got context from element 'vaapiencodeh264-0': gst.vaapi.Display=context, gst.vaapi.Display=(GstVaapiDisplay)"\(GstVaapiDisplayGLX\)\ vaapidisplayglx0";
Setting pipeline to PLAYING ...
New clock: GstAudioSrcClock
Redistribute latency...
Killing child process and waiting...

А скрипт просто зависает.По сути, кажется, что вызов Process.kill ничего не делает или, по крайней мере, сигнал не достигает дочернего процесса.Что не так с моим кодом?

Для справки, вот что происходит, когда я запускаю команду gst-launch-1.0 непосредственно из CLI и нажимаю ctrl+c через некоторое время:

gst-launch-1.0 -e v4l2src device=/dev/video0 ! videoconvert ! vaapih264enc rate-control=vbr bitrate=10000 quality-level=4 keyframe-period=30 num-slices=1 refs=1 max-bframes=2 ! mp4mux name=mux ! filesink location=test-006.mp4 sync=false
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Got context from element 'vaapiencodeh264-0': gst.vaapi.Display=context, gst.vaapi.Display=(GstVaapiDisplay)"\(GstVaapiDisplayGLX\)\ vaapidisplayglx0";
Setting pipeline to PLAYING ...
New clock: GstSystemClock

И сейчас идет захват.

Я нажимаю ctrl+c, когда я готов закончить захват, и вывод выглядит так:

^Chandling interrupt.
Interrupt: Stopping pipeline ...
EOS on shutdown enabled -- Forcing EOS on the pipeline
Waiting for EOS...
Got EOS from element "pipeline0".
EOS received - stopping pipeline...
Execution ended after 0:00:08.524849001
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
...