Smart Trim - відеофайл h.264 .MP4 у ffmpeg


1

Я хотів би взяти відео у форматі h.264 у якості вхідного сигналу і обрізати його, щоб почати з затухання від чорного і закінчити з зникненням до чорного з якомога менше кодування. Ці точки зникнення / виходу можуть потрапляти між I кадрами. Неможливо обрізати не-I кадри без повторного кодування.

Я зробив діаграму:

enter image description here

Я хотів би розділити вхідний файл на три частини. Частина A починається з I-Frame до точки 1 і закінчується в точці 1. Частина C починається з I-Frame в точці 2 і закінчується в наступному I-кадрі після вицвітання в чорний колір. Вони будуть повторно закодовані у формат I-Frame. Ці два сегменти будуть відносно короткими 10-30 секунд. Частина B (більшість відео) можна просто перекодувати за допомогою кодека: copy.

Частини A & amp; 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

Можна замінити 29.97 з точним 30000/1001.
Gyan

Відповіді:


0

Цього можна досягти за допомогою сегмента мультиплексора і concat демультиплексора.

Крок 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

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


По-перше, дякую вам за швидку відповідь! Будь ласка, виправте мене, якщо я не розумію цього, але я не впевнений, що це робить те, що я намагаюся зробити. Я не намагаюся застосовувати зникаючі і зникаючі виходи, які я намагаюся урізати до вже існуючих. Вклади і виходи в моєму відео джерела можуть бути дуже жорсткими. Сегментування може допомогти мені, і я зараз читаю. Дякую!
HGBells

Потім пропустіть фільтри затухання у кроці 2. Див. Редаговану команду.
Gyan

РЕДАКЦІЯ: Нічого, я бачу. Думаю, це спрацює!
HGBells
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.