LINUX.ORG.RU

как ffmpeg отрубаться когда нет данных на входе

 


0

2

Здравствуйте!
Никак не могу подобрать волшебный ключик к этой программе.
Есть сразу два вопроса из одной оперы.

1. Проблема вот в чем: записываю видео по протоколу rtmp в контейнер mp4 (но не суть). Все отлично, если бы ffmpeg после завершения стрима отрубался и завершал муксирование контейнера. Но он ждет чего то. Ключиком к отрубанию должна быть команда rtmp протокола NetStream.Unpublish. Он ее либо не видит, либо не знает про нее, либо знает но молчит. Т.е. ffmpeg переходит в вечную паузу, надеясь что поток продолжится когда либо. Также происходит со стартом, если стрим ещё не запущен, ffmpeg будет ждать его начала, тоже бесконечно.

Пробовал

-abort_on empty_output empty_output_stream
-muxdelay 1
-muxpreload 1

не подошло

Да, начал конечно программно шаманить, запускал ffmpeg через php скрипт и там уже мониторил. Проперял изменение в размере записанного файла, если размер 5 раз не меняется, то я считаю что запись завершена

2. Как корректно убивать ffmpeg? Ок, когда он в так сказать активной работе то убивается хорошо и INT и TERM сигналами с первого раза (Exiting normally, received signal 2.). Когда он в «вечной паузе», то первое послание сигнала INT (или TERM не важно) - никакой реакции, второй посыл такого же сигнала - убивается как Terminated, то есть не корректно. Поэтому не записывает атом в конец mp4 контейнера и файл не читабется. Почему со второго раза убивается и почему аварийно terminated?

★★★★

Почему со второго раза убивается и почему аварийно terminated?

потому что это синхронное чтение, не важно ffmpeg или нет, процесс ждет данные, по нормальному там должен быть pull или select в цикле проверки на сокет

anonymous2 ★★★★★ ()

в контейнер mp4 (но не суть).

хренасе, «не суть».

Это как раз самое важное здесь замечание. Нельзя писать в контейнер mp4, потому что он непригоден к восстановлению после аварийного завершения.

Или mp4 fragmented, или mpegts (лучше mpegts)

max_lapshin ★★★ ()