Smart Trim видео в формате h.264 .MP4 в формате ffmpeg

1846
HGBells

Я хотел бы взять живое видео h.264 в качестве входного сигнала и обрезать его, чтобы оно начиналось с постепенного увеличения от черного и заканчивалось постепенным переходом к черному с минимальным кодированием, насколько это возможно. Эти точки входа / выхода могут находиться между I кадрами. Невозможно обрезать кадры не-I без перекодирования.

Я сделал диаграмму:

enter image description here

Я хотел бы разделить входной файл на три части. Часть 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
Вы можете заменить `29.97` на точное` 30000 / 1001`. Gyan 8 лет назад 0

1 ответ на вопрос

0
Gyan

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

Прежде всего, спасибо за быстрый ответ! Пожалуйста, поправьте меня, если я не понимаю этого, но я не уверен, что это делает то, что я пытаюсь сделать. Я не пытаюсь применить постепенное исчезновение и постепенное исчезновение, которое я пытаюсь урезать к уже существующим. Входы и выходы в моем исходном видео могут быть очень тесными. Сегментация может все еще помочь мне, и я читаю об этом прямо сейчас. Спасибо! HGBells 8 лет назад 0
Затем пропустите фильтры исчезновения в Шаге 2. См. Отредактированную команду. Gyan 8 лет назад 0
РЕДАКТИРОВАТЬ: Неважно, я вижу. Я думаю, что это будет работать! HGBells 8 лет назад 0

Похожие вопросы