Как я мог бы обрезать последние 7 секунд моего видео с помощью ffmpeg?

Вопрос или проблема

Я записал видео на свою камеру, но не знаю точно, насколько оно длительное. Я хочу использовать 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 году — ответ обновлен с тех пор.

Три разных сценария. Я добавил первые два для пояснения.

  1. Хотите сохранить только последние N секунд видео вместо [-ss #] используйте [-sseof -#]

    Пример: -sseof -7

    $ ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
    

    Сохраняет последние 7 секунд видео и отбрасывает остальное

  2. Хотите удалить последние 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 час видео.

  3. Хотите удалить последние 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

Подробное объяснение команды

  1. ffmpeg: Это основная команда для запуска инструмента.
  2. -sseof -7: Этот параметр указывает FFmpeg начать запись с 7 секунд до конца файла.
  3. -i input.mp4: Эта часть команды обозначает входящий файл, который вы хотите обрезать.
  4. -c copy: Данный аргумент указывает, что мы хотим создать новый файл, используя существующие кодеки, что значительно ускоряет процесс, так как не происходит повторного кодирования.
  5. 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, так как он способен выполнять множество других задач, включая преобразование форматов, сжатие и многое другое.

Оцените материал
Добавить комментарий

Капча загружается...