Что не так с этим кодом?Я пытаюсь отправить 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 ...