ffmpeg: запись / захват потока и одновременное обнаружение сцены - PullRequest
0 голосов
/ 12 июня 2019

Можно ли как захватывать (записывать) поток RTSP , так и захватывать события смены сцены, используя одну команду ffmpeg?Я почти могу делать то, что хочу:

ffmpeg -i 'rtsp://mystream' \
-map 0:v -map 0:a -c:v copy -c:a copy -f segment \
-segment_time 300 -segment_format matroska -strftime 1 "%Y%m%d%H%M%S_video.mkv" \
-map 0:v -an -filter:v "select='gt(scene,0.1)'" -frames:v 1 "%Y%m%d%H%M%S_scenechange.png"

Это дает мне хорошие сегменты потока 300-х, сохраненные на диск, и scene.png при обнаружении смены сцены. Однако , scene.png появляется только тогда, когда я завершаю процесс, а когда я это делаю, я получаю только последнее событие сцены.В идеале я хотел бы получить новый PNG (или, что еще лучше, короткий видеоклип) каждый раз, когда обнаруживается изменение сцены, без прерывания записи video.mkv.Я уверен, что это можно сделать с помощью каналов и нескольких команд ffmpeg, но для простоты (и в основном для моего собственного любопытства на данный момент) я хотел бы посмотреть, что можно сделать с помощью всего одного процесса.

1 Ответ

0 голосов
/ 12 июня 2019

С -frames:v 1 вы получите только один вывод изображения.Без strftime для вывода изображения строка имени используется буквально.Вам также нужно будет остановить ffmpeg от генерации потока с постоянной частотой кадров для вывода изображения с использованием -vsync 0 (не замечено, поскольку вы ограничили общий вывод до 1 кадра)

Использовать

ffmpeg -i 'rtsp://mystream' \
-map 0:v -map 0:a -c:v copy -c:a copy -f segment \
-segment_time 300 -segment_format matroska -strftime 1 "%Y%m%d%H%M%S_video.mkv" \
-map 0:v -an -filter:v "select='gt(scene,0.1)'" -vsync 0 -strftime 1 "%Y%m%d%H%M%S_scenechange.png"
...