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?

★★★★

Последнее исправление: gobot (всего исправлений: 1)

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

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

anonymous2 ★★★★★
()

empty_output

Это разве не про выход?

Тебе нужен stimeout, указанный перед входом, разумеется

rukez ★★★★
()

открой rtmp исходники в ffmpeg, ты же бодро дебажил google-chrome? смотрел на stackvoerflow?

anonymous
()
Ответ на: комментарий от anonymous2

Ок, но почему именно со второого раза? Он что на второй раз просыпается или как?

gobot ★★★★
() автор топика
Ответ на: комментарий от rukez

Тебе нужен stimeout, указанный перед входом, разумеется

Option stimeout not found.

Это разве не про выход?

Не помогает это

gobot ★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну это на самый крайний случай. Есть другие варианты, более приятные, чем копания в исходниках ффмпега...

gobot ★★★★
() автор топика

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

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

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

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

max_lapshin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.