Заметки · 25.04.2022

Усечение видеофайлов

На днях столкнулся с рядом видеослайдов в формате mp4 с одинаковой продолжительностью, но рекламной вставкой в конце. Вставка длится буквально секунду, но всё же от неё необходимо избавиться и желательно без использования внешних программ.

Несомненным плюсом являлся тот факт, что продолжительность у роликов была совершенно идентична и равнялась 59 секундам. С рекламной вставкой ролики разбухли на 1 секунду и стали длиться ровно минуту. Всё, что требовалось — это пробежаться в цикле по каждому файлу и отрезать пресловутую секунду с помощью FFMPEG.

FFMPEG обрезает видео отталкиваясь от его длительности. Чтобы обрезать файл с конца — нужно указать сколько секунд должен длиться файл.

В итоге у меня получился вот такой код:

$timeduration = Read-Host "Укажите продолжительность для заданных видеофайлов в секундах"
Get-ChildItem -Filter *.mp4 | ForEach-Object {
$cmd = "-i "+ "$_" + " -t $timeduration " + "$($_.Name)_trim.mp4"
Start-Process -FilePath ffmpeg.exe -ArgumentList $cmd -Wait -NoNewWindow }

Данная конструкция будет корректно работать только при условии одинаковой продолжительности файлов.

Чтобы обрезать куски у видеофайлов с разной продолжительностью — нужно сначала получить длительность видео, потом перевести его в секунды и только после этого вычитать из времени файла количество секунд для отсечения.