1

Когда у меня есть видеофайл MP4, который длится 2 часа и я хочу удалить 30 секунд от начала и 1 минуту от конца, я использую ffmpeg как это.

ffmpeg -ss 30 video.mp4 -c copy -t 1:58:30 output.mp4

Работает нормально. Но я должен рассчитать длину выходного видео. Есть ли возможность отрезать определенное время от конца видео файла?

Я хочу написать так.

ffmpeg -ss 30 video.mp4 -c copy --offset-from-last 1:00 output.mp4

2 ответа2

2

В ffmpeg такой опции нет.

Вы должны проанализировать длительность с помощью ffprobe , а затем рассчитать необходимое смещение с помощью скрипта. Чтобы получить общую продолжительность:

ffprobe -loglevel error input.mp4 \
-show_format -show_entries format=duration -of compact=p=0:nk=1

Это показывает вывод в s.msec . Вы также можете использовать опцию -sexagesimal чтобы она печатала HH:MM:SS.msec , но это немного усложняет вычисление смещения.

Простой скрипт bash для этого:

#!/bin/bash
input=/path/to/your/file.mp4
start="30"
offset="60"
duration="$(ffprobe -loglevel error "$input" -show_format -show_entries format=duration -of compact=p=0:nk=1)"
end=$(echo "$duration - $offset" | bc)
echo ffmpeg -ss "$start" -i "$input" -c copy -to "$end"

Обратите внимание, что вы хотите -to вместо -t . Первый будет обрезать поток до указанной точки, в то время как с -t вы получите поток указанной длины .

0

Проблема ключевых кадров может привести к неточности, и она не работает с потоками субтитров, но в остальном это работает для меня.

ffmpeg -ss 30 -i in.mp4 -itsoffset -90 -i in.mp4 -c copy -map 1:a:0 -map 0 -shortest inter.mp4

а потом

ffmpeg -i inter.mp4 -c copy -map 0 -map -0:0 final.mp4

-ss 30 - начальная отделка. -itsoffset -90 - начало + конец трима .

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