#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
пакет.