Программно завершить дочерний процесс ffmpeg на Raspberry Pi

#ffmpeg #raspberry-pi

#ffmpeg #raspberry-pi

Вопрос:

Возможно ли чисто завершить ffmpeg, когда он выполняется как дочерний процесс под Linux (в частности, на Raspberry Pi 4B)? У меня есть приложение на .NET Core 3.1, которое запускает ffmepg с помощью следующей команды, которая должна кодировать поток h.264 в файл MP4:

 ffmpeg -framerate 24 -i - -b:v 2500k -c copy video.mp4
  

Через некоторый произвольный промежуток времени я хочу завершить работу ffmpeg, но все, что я пытаюсь, либо игнорируется, либо приводит к немедленному завершению работы ffmpeg — он никогда не записывает фрагмент MOOV в конец файла MP4, что приводит к повреждению файла, который невозможно воспроизвести. Я понимаю, что создание этого фрагмента может занять некоторое время, и я попытался оставить процесс в покое на срок до 60 секунд, что намного дольше, чем требуется для интерактивного кодирования h.264 в MP4 на том же устройстве. Для справки, я знаю, как создать «фрагментированный» MP4, который в основном воспроизводим (с помощью -movflags переключателя и других), но я пытаюсь сгенерировать правильный MP4.

Я пытался отправить Q ключ с различными комбинациями CR LF или без них, которые, как я видел, упоминались в похожих вопросах, но я думаю, что это доступно только для Windows.

Я перепробовал все сигналы Unix, а также комбинации двух сигналов. Я где-то видел (я думаю, на самом сайте ffmpeg), что SIGINT следует отправлять дважды, но это ничего не дает. В другом сообщении SO кто-то предложил отправить, SIGQUIT который также ничего не делает. Интересно, что отправка, SIGINT за которой SIGQUIT следует единственная комбинация, которая фактически завершает процесс, но она немедленно завершается следующим выводом:

 Error writing trailer of /media/ramdisk/video.mp4: Immediate exit requested
frame=  236 fps= 29 q=-1.0 Lsize=   28928kB time=00:00:09.79 bitrate=24201.9kbits/s speed= 1.2x
video:29167kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Exiting normally, received signal 2.
  

Я пробовал длительную задержку между ними, ничего не происходит до SIGQUIT момента, когда он реагирует, как показано выше. Как ни странно, иногда он говорит received signal 3 вместо 2.

Должен быть какой-то трюк, которого мне не хватает.

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

1. Как вы выполняете SIG* ?

2. Используя Mono.Posix.NETStandard пакет.