1

Я хотел бы взять живое видео 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 ответ1

0

Это может быть достигнуто с помощью сегмента 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 Конкат

а) Подготовить файл concat 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, за исключением окончательного вывода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .