Smart Trim h.264 .MP4 видео файл в ffmpeg
Я хотел бы взять живое видео h.264 в качестве входного сигнала и обрезать его, чтобы оно начиналось с постепенного увеличения от черного и заканчивалось постепенным переходом к черному с минимальным кодированием, насколько это возможно. Эти точки появления / затухания могут находиться между I кадрами. Невозможно обрезать кадры не-I без перекодирования.
Я сделал диаграмму:
Я хотел бы разделить входной файл на три части. Часть A начиналась бы в I-кадре до точки 1 и заканчивалась в точке 1. Часть C начиналась в I-кадре в точке 2 и заканчивалась в следующем I-кадре после перехода в черный цвет. Они будут перекодированы в формат I-Frame. Эти два сегмента будут относительно короткими 10-30 секунд. Часть B (большая часть видео) может быть просто перекодирована с использованием codec:copy.
Части A & C будут обрезаны (либо автоматически с использованием обнаружения черного, либо вручную), а затем все видео будет объединено с использованием ffmpeg.
Я хотел бы использовать ffmpeg, потому что это то, с чем я больше всего знаком, и остальная часть моего рабочего процесса использует его исключительно. Какие командные строки будут достигать этого?
Для любопытных, вот моя рабочая командная строка для захвата живого видео в кодированные сегменты. С этого момента легко отказаться от ненужного видео и перекодировать сегменты, если это необходимо для обрезки. Последний шаг - объединить сегменты.
ffmpeg -f dshow -rtbufsize 702000k -video_size 1920x1080 -framerate 29.97 -pixel_format uyvy422 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 0 -c:v libx264 -s 1280x720 -crf 18 -profile:v main -level 3.1 -pix_fmt yuv420p -c:a libvo_aacenc -b:a 128k -ac 1 -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4
1 ответ
Это может быть достигнуто с помощью сегмента 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, за исключением окончательного вывода.