Вопрос или проблема
Я записал видео на свою камеру, но не знаю точно, насколько оно длительное. Я хочу использовать FFmpeg, чтобы сохранить и обрезать только последние 7 секунд видео. Это возможно?
Я попробовал команду:
ffmpeg -t 00:00:07 -i input.avi -vcodec copy newfile.avi
Но она просто пропускает первые 7 секунд видео и отображает видео перевернутым.
Используйте опцию -sseof
(поиск относительно конца файла).
Скажите, вы хотите сохранить последние 7 секунд, вы можете использовать:
ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
Смотрите документацию здесь.
Примечание: этот ответ был опубликован в 2014 году, когда этой опции не существовало. Она была добавлена только в 2015 году — ответ обновлен с тех пор.
Три разных сценария. Я добавил первые два для пояснения.
-
Хотите сохранить только последние N секунд видео вместо [-ss #] используйте [-sseof -#]
Пример: -sseof -7
$ ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
Сохраняет последние 7 секунд видео и отбрасывает остальное
-
Хотите удалить последние N секунд видео и сохранить остальное. (Вводите продолжительность вручную).
Эта опция требует ручного ввода времени окончания (для автоматического см. #3)
Используйте -ss и -t (продолжительность от начальной точки) или -to (конкретная метка времени)
Вам нужно будет вручную рассчитать время окончания для этой опции.
Примеры:$ ffmpeg -ss 00:00:00 -to 01:32:00 -i input.mp4 -c copy output.mp4;
Сохраняет видео с метки времени 00:00:00 до метки времени 01:32:00
$ ffmpeg -ss 00:00:04 -t 01:00:00 -i input.mp4 -c copy output.mp4;
Сохраняет видео с метки времени 00:00:04 до метки времени 01:00:04
1 час видео. -
Хотите удалить последние N секунд видео и сохранить остальное. (Автовыявление продолжительности файла)
Вам нужно будет использовать как
ffmpeg
, так иffprobe
, но это можно сделать в терминале с очень небольшим количеством кода.Единственный способ отрезать секунды, основываясь на времени окончания, — это получить время окончания. Я занимаюсь пакетной обработкой видео с разной длиной, так что ручной поиски и ввод каждой продолжительности были невозможны. Мне нужно было автоматически получить значение продолжительности и передать его в ffmpeg.
Магическая формула:
duration=`ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4` duration=`bc $duration - seconds`
Пример:
$ duration=`ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4` $ duration=`bc $duration - 7` $ ffmpeg -ss 00:00:00 -to $duration -i input.mp4 -c copy output.mp4
Удаляет последние 7 секунд видео.
Вот bash-скрипт для удобства:
#!/bin/bash
# Аргументы
FILE_RAW=$1
TRIM_EOF_DURATION=${2:-1.0} # По умолчанию удаляется 1.0 секунда от конца файла
# Подготовка переменных
BASE_PATH=$(dirname $(readlink -f $FILE_RAW))
FILENAME_EXT="$(basename "${FILE_RAW}")"
FILENAME_ONLY="${FILENAME_EXT%.*}"
EXT_ONLY="${FILENAME_EXT#*.}" # Или задать жестко, как "mp4"
FILENAME_ONLY_PATH="${BASE_PATH}/${FILENAME_ONLY}"
# Удаление длины от конца файла
INPUT_DURATION=$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "${FILENAME_ONLY_PATH}.${EXT_ONLY}")
OUTPUT_DURATION=$(bc <<< "$INPUT_DURATION-$TRIM_EOF_DURATION")
ffmpeg -i "${FILENAME_ONLY_PATH}.${EXT_ONLY}" -map 0 -c copy -t "$OUTPUT_DURATION" "${FILENAME_ONLY_PATH}_Trim_${TRIM_EOF_DURATION}.${EXT_ONLY}"
Примечание: Сделайте скрипт исполняемым: chmod +x trim_video.sh
Использование (Имя выходного файла: <PATH_TO_INPUT_VIDEO>_Trim_<TRIM_EOF_DURATION>.mp4
)
. <PATH_TO_THIS_SCRIPT>/trim_video.sh <PATH_TO_INPUT_VIDEO> <OPTIONAL_TRIM_EOF_DURATION>
Пример: Удалить 7.0 секунд от конца файла (Выход: ~/Videos/input_video_Trim_7.0.mp4
)
. ~/trim_video.sh ~/Videos/input_video.mp4 7.0
Вот скрипт для cmd.exe в Windows, который не использует ffprobe
(использует только ffmpeg
):
@echo off
setlocal
if "%~1"=="" (
echo Использование: %~n0 input_video_file seconds_to_remove
goto :eof
)
set "input=%~1"
set "x=%~2"
set "output=%~n1_trimmed%~x1"
REM Получить продолжительность из вывода ffmpeg
for /f "tokens=1,2 delims=, " %%a in ('ffmpeg -i "%input%" 2^>^&1 ^| findstr /i "Duration"') do (
set duration=%%b
)
echo Строка продолжительности: %duration%
REM Использовать PowerShell, чтобы получить общую продолжительность в секундах
for /f "usebackq delims=" %%d in (`powershell.exe -NoProfile -Command "[TimeSpan]::Parse('%duration%').TotalSeconds"`) do set "DURATION=%%d"
echo Общая продолжительность: %DURATION% секунд
REM Рассчитать новую продолжительность
for /f "usebackq delims=" %%e in (`powershell.exe -NoProfile -Command "%DURATION% - %x%"`) do set "NEW_DURATION=%%e"
echo Новая продолжительность: %NEW_DURATION% секунд
REM Запустить ffmpeg для обрезки видео
ffmpeg -i "%input%" -t %NEW_DURATION% -c copy "%output%"
echo Выходной файл "%output%" был создан без последних %x% секунд.
Пример использования:
script.bat input.mp4 7
удалит последние 7 секунд в input.mp4: создаст новый файл input_trimmed.mp4
Если использовать этот скрипт на видео, которые содержат телеметрическую информацию (например, GoPro GPMF), замените ffmpeg -i "%input%" -t %NEW_DURATION% -c copy "%output%"
на:
REM Запустить ffmpeg для обрезки видео
ffmpeg -i "%input%" -t %NEW_DURATION% -map 0:v -map 0:a -map 0:3 -copy_unknown -tag:2 gpmd -c copy "%output%"
(дополнительные атрибуты -map 0:v -map 0:a -map 0:3 -copy_unknown -tag:2 gpmd
сохраняют телеметрическую информацию)
Ответ или решение
Как обрезать последние 7 секунд видео с помощью FFmpeg
Если вы столкнулись с необходимостью обрезать последние 7 секунд вашего видеофайла, то FFmpeg предоставляет удобный и эффективный способ сделать это. В данное время актуально использовать параметр -sseof
, который позволяет быстро находить и работать с концом видео.
Использование FFmpeg для обрезки последних 7 секунд
Для того чтобы сохранить только последние 7 секунд вашего видео, вам достаточно использовать следующую команду:
ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
Подробное объяснение команды
ffmpeg
: Это основная команда для запуска инструмента.-sseof -7
: Этот параметр указывает FFmpeg начать запись с 7 секунд до конца файла.-i input.mp4
: Эта часть команды обозначает входящий файл, который вы хотите обрезать.-c copy
: Данный аргумент указывает, что мы хотим создать новый файл, используя существующие кодеки, что значительно ускоряет процесс, так как не происходит повторного кодирования.output.mp4
: Это имя выходного файла, в который будет сохранен обработанный видеопоток.
Альтернативные подходы
Если вы хотите удалить последние 7 секунд видео и сохранить остальную часть, вам придется узнать полную длину видео и затем задать новое время окончания. Это можно сделать с помощью команды ffprobe
, которая вычислит длительность вашего видео:
duration=$(ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4)
new_duration=$(echo "$duration - 7" | bc)
ffmpeg -i input.mp4 -t $new_duration -c copy output.mp4
Объяснение альтернативного метода:
ffprobe
: Этот инструмент используется для получения информации о файле, в том числе его длительности.$(...)
: Используется для выполнения команды и присвоения результата переменной.bc
: Это утилита, которая позволяет вам выполнять вычисления. В этом случае она используется для вычитания 7 секунд из общей длительности.-t $new_duration
: Данный аргумент ограничивает время окончания видеоряда.
Автоматизация процесса через скрипты
Если вы часто работаете с видеофайлами, имеет смысл автоматизировать эти процессы через скрипты. Пример Bash-скрипта, который позволяет выполнить обрезку последнего времени концовки:
#!/bin/bash
# Аргументы
FILE_RAW=$1
TRIM_EOF_DURATION=${2:-7} # По умолчанию 7 секунд.
# Получение длительности
INPUT_DURATION=$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "${FILE_RAW}")
OUTPUT_DURATION=$(bc <<< "$INPUT_DURATION-$TRIM_EOF_DURATION")
# Обрезка видео
ffmpeg -i "$FILE_RAW" -map 0 -c copy -t "$OUTPUT_DURATION" "${FILE_RAW%.*}_Trimmed.mp4"
Заключение
FFmpeg — это мощный инструмент, который позволяет не только обрезать видео, но и выполнять множество других операций, связанных с обработкой медиафайлов. Используя параметры -sseof
и -t
, вы можете быстро настроить ваше видео в соответствии с вашими потребностями. Возможно, вам будет интересно подробнее изучить возможности FFmpeg, так как он способен выполнять множество других задач, включая преобразование форматов, сжатие и многое другое.