[Обучалово][Вайб-лонгинг]FFmpeg для самых маленьких дтферов

Самый хороший мальчик. Полюбите его.

И снова здравствуйте, друзья мои. На дворе у нас вторник, а это значит, что в нашем самом популярном блоге на dtf.ru очередной пост тематики Обачалово.

Меня часто спрашивают: "Наташ, как ты ловко работаешь с видео?" На что я всегда отвечаю, что для комфортной нарезки гифок и прочих работ с видео любой уважающий себя дтфер обязан изучить FFmpeg.

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

В этом руководстве мы пошагово разберем основы, установку, часто используемые команды и примеры.

📦 Что такое FFmpeg?

FFmpeg — это инструмент командной строки, который умеет:

  • Конвертировать аудио и видео в разные форматы (MP4, MP3, AVI, MKV, WEBM и др.)
  • Извлекать аудио из видео
  • Урезать или обрезать видеофрагменты
  • Менять разрешение, битрейт и кодеки
  • Работать с субтитрами и метаданными
  • Захватывать экран или видеопоток с камеры

FFmpeg используется в YouTube, VLC, OBS и даже в Netflix.

🔽 Установка FFmpeg

🔹 Windows

  1. Перейдите на сайт: https://ffmpeg.org/download.html
  2. Выберите Windows
  3. Скачайте архив release full:
    https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z
  4. Распакуйте его (например, в C:\ffmpeg)
  5. Добавьте путь C:\ffmpeg\bin в переменную среды Path

Проверка работы в командной строке:

ffmpeg -version

🧪 Основы использования FFmpeg

Формат команды:

ffmpeg -i input.mp4 output.avi

Пример выше конвертирует видео input.mp4 в формат AVI.

✅ Часто используемые команды

🎞 Конвертация видео

MP4 → AVI

ffmpeg -i input.mp4 output.avi

Понизить качество видео

ffmpeg -i input.mp4 -b:v 1000k -b:a 128k output.mp4

🔈 Извлечение аудио

Извлечь MP3 из видео:

ffmpeg -i video.mp4 -q:a 0 -map a audio.mp3

✂ Обрезка видео (по времени)

Вырезать фрагмент с 00:00:10 по 00:00:20

ffmpeg -ss 00:00:10 -to 00:00:20 -i input.mp4 -c copy cut.mp4

Совет: -c copy означает "без перекодирования", это быстрее работает.

✂ Нарезка видео на 10с клипы

ffmpeg -i video.mp4 -acodec copy -f segment -segment_time 10 -vcodec copy -reset_timestamps 1 -map 0 video_clip_%%d.mp4

📏 Изменение разрешения

Сделать видео в 720p:

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4

🔀 Объединение двух видеофайлов с разным расширением и fps

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]scale=1280:720,fps=30[v0];[1:v]scale=1280:720,fps=30[v1]; [v0][v1]concat=n=2:v=1:a=0[outv]" -map "[outv]" output.mp4

📶 Преобразование аудио

WAV → MP3:

ffmpeg -i input.wav output.mp3

Понизить битрейт аудио:

ffmpeg -i input.mp3 -b:a 128k output.mp3

🧰 Полезные параметры

[Обучалово][Вайб-лонгинг]FFmpeg для самых маленьких дтферов

📚 Дополнительные ресурсы

Для простоты работы с FFmpeg создайте батники с командами, которые вы часто используете и работайте с видео простым drag-and-drop'ом файлов:

ffmpeg -i %1 -vf "transpose=1" "%~n1_new.mp4"

Напишем что-нибудь полезное для лонгеров на dtf.ru

1. Скрипты нарезающие на клипы и объединяющие в композицию с красивым переходом между ними

Очень часто для оформления постов существует необходимость создавать гифки с геймплеем игр и т.п.
Для этого надо открывать After Effects или Vegas, нарезать видео на клипы...

Моё лицо когда я делаю рутинные операции в AE
Моё лицо когда я делаю рутинные операции в AE

Сделаем скрипт делающие такие гифки прямо на рабочем столе без запуска тяжелых программ.

Делаем 2 батника:

1. clips_segment.bat

set "SEGMENT_TIME=6" ffmpeg -i %1 -acodec copy -f segment -segment_time %SEGMENT_TIME% -vcodec copy -reset_timestamps 1 -map 0 "%~n1_%%d.mp4"

Этот батник разбивает видео на видеоклипы по ключевым кадрам с интервалом в 6 секунд. Получаются клипы по 6 секунд с небольшим отклонением.

2. xfade_join.bat

@echo off setlocal enabledelayedexpansion :: Параметры :: Тип перехода между клипами set "TRANSITION=fade" :: Длительность перехода между клипами в микросекундах set "FADE_DURATION__MS=500000" :: Ширина и высота выходного видео 854/480(480p на YT) ~= 592/336(592 - ширина блока на dtf.ru) set "TARGET_VIDEO_WIDTH=592" set "TARGET_VIDEO_HEIGHT=336" :: FPS set "TARGET_VIDEO_FPS=30" :: Качество кодирования [0-51] 0-lossless, 23-default. Чем меньше - тем лучше качество и больше размер видео set "TARGET_VIDEO_CRT=15" :: Пресет кодирования, время на задачу - ultrafast superfast veryfast faster fast medium slow slower veryslow set "TARGET_VIDEO_ENCODE_PRESET=slower" :: Максимальный битрейт set "TARGET_VIDEO_BITRATE_MAX=800K" :: Выходной файл set "OUTPUT=xfade_output.mp4" :: Длительность перехода между клипами, целая часть set /a FADE_DURATION__WHOLE=!FADE_DURATION__MS! / 1000000 :: Длительность перехода между клипами, дробная часть set /a FADE_DURATION__FRACTION=!FADE_DURATION__MS! %% 1000000 set "FADE_DURATION__FRACTION=000000!FADE_DURATION__FRACTION!" set "FADE_DURATION__FRACTION=!FADE_DURATION__FRACTION:~-6!" :: Проверка ffmpeg where ffmpeg >nul 2>&1 if errorlevel 1 ( echo [!] ffmpeg не найден. Убедитесь, что он установлен. pause exit /b ) :: Сбор входов, рассчёт времени клипов, суммирование общего времени, рассчёт оффсета для xfade set "INPUTS=" set /a INDEX=0 :: Первый клип должен быть обрезан слева на длину перехода set /a CLIPS_DURATION_TOTAL__MS=-1*FADE_DURATION__MS for %%F in (%*) do ( echo "FILE INDEX - !INDEX!" echo File - %%~fF for /f "tokens=*" %%a in ( 'ffprobe -v error -select_streams v:0 -show_entries stream^=duration -of csv^=p^=0 "%%~fF" 2^>nul' ) do ( set CLIP__DURATION=%%a echo "CLIP__DURATION - !CLIP__DURATION!" ) :: Добавляем нули, если дробная часть короткая for /f "tokens=1,2 delims=." %%b in ("!CLIP__DURATION!000000") do ( set "CLIP__WHOLE=%%b" set "CLIP__FRACTION=%%c" ) :: Берем только 6 цифр после точки set "CLIP__FRACTION=!CLIP__FRACTION:~0,6!" :: Удаляем ведующие нули из строки чтобы преобразование в число было по десятичному for /f "tokens=* delims=0" %%A in ("!CLIP__FRACTION!") do set "CLIP__FRACTION=%%A" :: Если после удаления нулей строка пуста (было "000...0"), возвращаем 0 if "!CLIP__FRACTION!"=="" set "CLIP__FRACTION=0" set /a CLIP__FRACTION=!CLIP__FRACTION! set /a CLIPS_DURATION_TOTAL__MS+=CLIP__WHOLE * 1000000 + CLIP__FRACTION set /a CLIP_XFADE_OFFSET__MS__!INDEX!=CLIPS_DURATION_TOTAL__MS-^(INDEX+1^)*FADE_DURATION__MS set /a CLIP_XFADE_OFFSET_MS__INDEX=CLIP_XFADE_OFFSET__MS__!INDEX! echo "CLIP_XFADE_OFFSET_M S- !CLIP_XFADE_OFFSET_MS__INDEX!" set "INPUTS=!INPUTS! -i "%%~fF"" set /a INDEX+=1 ) :: Для зацикливания последнего клипа с первым set "INPUTS=!INPUTS! -i %1" :: Кол-во клипов set /a CLIPS__COUNT=INDEX :: Кол-во клипов - 1 set /a CLIPS__COUNT__M1=CLIPS__COUNT-1 if !CLIPS__COUNT! LSS 2 ( echo [!] Нужно минимум два видеофайла. pause exit /b ) :: Формирование filter_complex set "FILTER=" for /L %%i in (0,1,!CLIPS__COUNT!) do ( set /a START_FRAME = FADE_DURATION__MS * TARGET_VIDEO_FPS / 1000000 set "TRIM_ADD=" if %%i==0 ( set "TRIM_ADD=,trim=start_frame=!START_FRAME!" ) if %%i==!CLIPS__COUNT! ( set "TRIM_ADD=,trim=end_frame=!START_FRAME!" ) set "FILTER=!FILTER![%%i:v]scale=!TARGET_VIDEO_WIDTH!:!TARGET_VIDEO_HEIGHT!:force_original_aspect_ratio=decrease,pad=!TARGET_VIDEO_WIDTH!:!TARGET_VIDEO_HEIGHT!:-1:-1:color=black,fps=!TARGET_VIDEO_FPS!,settb=AVTB!TRIM_ADD![%%i:v:scaled];" ) for /L %%i in (0,1,!CLIPS__COUNT__M1!) do ( set /a I_P1=%%i+1 set "INPUT_ADD=v%%i" if %%i==0 ( set "INPUT_ADD=0:v:scaled" ) set "OUTPUT_ADD=[v!I_P1!]" if %%i==!CLIPS__COUNT__M1! ( set "OUTPUT_ADD=,format=yuv420p,fps=30[video]" ) set /a CLIP_XFADE_OFFSET__WHOLE=CLIP_XFADE_OFFSET__MS__%%i / 1000000 set /a CLIP_XFADE_OFFSET__FRACTION=CLIP_XFADE_OFFSET__MS__%%i %% 1000000 set "CLIP_XFADE_OFFSET__FRACTION=000000!CLIP_XFADE_OFFSET__FRACTION!" set "CLIP_XFADE_OFFSET__FRACTION=!CLIP_XFADE_OFFSET__FRACTION:~-6!" set "FILTER=!FILTER![!INPUT_ADD!][!I_P1!:v:scaled]xfade=transition=!TRANSITION!:duration=!FADE_DURATION__WHOLE!.!FADE_DURATION__FRACTION!:offset=!CLIP_XFADE_OFFSET__WHOLE!.!CLIP_XFADE_OFFSET__FRACTION!!OUTPUT_ADD!;" ) echo "ffmpeg !INPUTS! -y -filter_complex "!FILTER!" -map [video] -c:v libx264 -preset !TARGET_VIDEO_ENCODE_PRESET! -crf !TARGET_VIDEO_CRT! -maxrate !TARGET_VIDEO_BITRATE_MAX! -bufsize 2M "!OUTPUT!"" :: Запуск ffmpeg ffmpeg !INPUTS! -y -filter_complex "!FILTER!" -map [video] -c:v libx264 -preset !TARGET_VIDEO_ENCODE_PRESET! -crf !TARGET_VIDEO_CRT! -maxrate !TARGET_VIDEO_BITRATE_MAX! -bufsize 2M "!OUTPUT!" echo Склейка завершена. Файл: !OUTPUT! :: pause

Если бы вы знали сколько мне времени и нервов вчера съело портирование этого скрипта с NodeJS на bat, то Вы бы расплакались 😥

А этот батник склеивает клипы, которые Вы на него сбросите.

Как пользоваться?

  1. Качаем видео с геймплеем игры
  2. Drag-and-drop'ом бросаем видео на clips_segment.bat. Получаем клипы
  3. Выбираем клипы. Выделяем.
  4. Drag-and-drop'ом бросаем клипы на xfade_join.bat. Получаем итоговое видео.
Типо видеоинструкция.

Полученное видео

Между клипами есть плавные переходы xfade

Итого за минуту у нас получилась гифка с гейплеем игры. За это время у Вас Афтер только загрузится.

2. Скрипт объединяющий видео с одного файла с аудио со второго

У многих анимешников есть проблема с тем что их любимые мульфильмы скачиваются с отдельной аудидорожкой на русском. Из-за этого становится проблемой смотреть маняме например на телефоне. Сделаем батник объединяющий видео с одного файла с аудио со второго.

@echo off setlocal :: Проверка наличия ffmpeg where ffmpeg >nul 2>&1 if %errorlevel% neq 0 ( echo Ошибка: ffmpeg не найден. Установите ffmpeg и добавьте его в PATH. pause exit /b 1 ) :: Проверка количества аргументов if "%~1"=="" ( echo Использование: echo 1. Перетащите видео и аудиофайлы на этот скрипт echo 2. Или запустите: %~nx0 "видео файл.mkv" "аудио файл.mp3" pause exit /b 1 ) if "%~2"=="" ( echo Ошибка: нужно указать два файла - видео и аудио pause exit /b 1 ) :: Инициализация переменных set "video_file=" set "audio_file=" :: Проверка первого файла ffmpeg -i "%~1" 2>&1 | findstr /i /c:"Video:" >nul && set "video_file=%~1" || ( ffmpeg -i "%~1" 2>&1 | findstr /i /c:"Audio:" >nul && set "audio_file=%~1" ) :: Проверка второго файла ffmpeg -i "%~2" 2>&1 | findstr /i /c:"Video:" >nul && set "video_file=%~2" || ( ffmpeg -i "%~2" 2>&1 | findstr /i /c:"Audio:" >nul && set "audio_file=%~2" ) :: Проверка результатов if not defined video_file ( echo Ошибка: не найден видеофайл среди: echo 1. "%~1" echo 2. "%~2" pause exit /b 1 ) if not defined audio_file ( echo Ошибка: не найден аудиофайл среди: echo 1. "%~1" echo 2. "%~2" pause exit /b 1 ) :: Создание выходного файла set "output_file=output_%~n1.mp4" echo. echo Видео: "%video_file%" echo Аудио: "%audio_file%" echo Выход: "%output_file%" echo. :: Обработка файлов ffmpeg -i "%video_file%" -i "%audio_file%" -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 -shortest "%output_file%" if %errorlevel% equ 0 ( echo Успешно создан файл: "%output_file%" ) else ( echo Ошибка обработки echo Для сложных случаев попробуйте: echo ffmpeg -i "%video_file%" -i "%audio_file%" -c:v copy -c:a libmp3lame -b:a 192k -map 0:v:0 -map 1:a:0 "%output_file%" ) pause

Для использования просто перетащите 2 файла: с видео, с аудио на батник. По желанию можете написать скрипт на Вашем любимом языке программирования, чтобы мержились все файлы в папке и не было необходимости переносить файлы на батник ручками.

🏁 Заключение

FFmpeg — это не просто конвертер, а настоящий швейцарский нож для работы с медиа. Его сложность компенсируется невероятной гибкостью. После освоения базовых команд вы сможете делать автоматические обработки медиафайлов, строить собственные пайплайны для YouTube, Telegram или подкастов.

Если есть вопросы - пишите в комменты.

97
11
5
2
2
1
1
1
1
1
100 комментариев