Это может быть достигнуто с помощью сегмента muxer и concat demuxer.
Шаг 1 Сегментируйте вход
Предположим, что вы хотите извлечь, 00:50
чтобы 02:20
из захваченного источника. Допустим, размер GOP составляет 3 секунды. Поскольку ваша начальная точка может быть последним кадром GOP, нам нужно начать на одну длину GOP раньше. Итак, обрезка в том 00:47
и длительность извлечения есть 01:33
. Так,
ffmpeg -ss 0:57 -t 01:33 -i input.mp4 -c copy -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4
Это создаст сегменты, каждый GOP длиной. Так что не используйте это для внутрикодированных потоков :)
Шаг 2 Обрежьте сегменты головы и хвоста
Удалите все лишние сегменты в голове и хвосте - возможно, если длина GOP мала. Затем обрежьте правильные верхний и хвостовой сегменты:
ffmpeg -ss 2 -i seg00.mp4 -crf 18 -map [v] -map [a] seg00a.mp4 ffmpeg -t 2 -i seg46.mp4 -crf 18 -map [v] -map [a] seg46a.mp4
Шаг 3 Конкат
а) подготовить файл конкатsegments.txt
file 's00a.mp4' file 's01.mp4' file 's02.mp4' ... file 's44.mp4' file 's45.mp4' file 's46a.mp4'
б)
ffmpeg -f concat -i segments.txt -c copy -fflags +genpts trimmed.mp4
Поскольку вы работаете с живым захватом, вы можете выводить данные в TS вместо MP4, за исключением окончательного вывода.