Jump to content
Asterios

FFmpeg для записи видео и звука (эксперименты)


zuz

Recommended Posts

Posted (edited)

Всем привет. Хочу поделиться опытом использования FFmpeg. Этим инструментом можно записывать и конвертировать видео и аудио. Если тонко все настроить можно добиться боле лучшей картинки, чем при использовании допустим той же obs. И что, не мало важно, без рендера. Видео сразу можно грузить на Ютуб. В настройках записи FFmpeg указаны стандартные параметры, которые можно скорректировать по своему усмотрению для баланса качества и размера файла.  Сразу скажу, что я не профи, а делюсь тем, с чем получилось немного разобраться. Приветствуется критика и исправление ошибок. FFmpeg будем использовать в скриптах, что позволит упростить понимание и автоматизировать процесс. От пользователя нужно будет только подредактировать текст настроек FFmpeg, при желании, и все. Для проверки устройств, с которыми может работать  FFmpeg есть команда для терминала: ffmpeg -list_devices true -f dshow -i dummy

После ввода команды в терминале список устройств будет выглядеть примерно так:

Скрытый текст
[dshow @ 000001e4ab3c0440] "USB2.0 HD UVC WebCam" (video)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_pnp_\\?\usb#vid_2b7e&pid_b597&mi_00#7&10c33a28&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 000001e4ab3c0440] "screen-capture-recorder" (video)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{4EA69364-2C8A-4AE6-A561-56E4B5044439}"
[dshow @ 000001e4ab3c0440] "OBS Virtual Camera" (none)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{A3FCE0F5-3493-419F-958A-ABA1250EC20B}"
[dshow @ 000001e4ab3c0440] "Microphone (C-Media(R) Audio)" (audio)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{257C02F9-C948-4960-A974-755869C15688}"
[dshow @ 000001e4ab3c0440] "virtual-audio-capturer" (audio)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_sw_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\{8E146464-DB61-4309-AFA1-3578E927E935}"
[dshow @ 000001e4ab3c0440] "Line 1 (Virtual Audio Cable)" (audio)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{13039C72-8BFB-49DC-A601-A37F5EBE803D}"
[dshow @ 000001e4ab3c0440] "AI Noise-cancelling Input (ASUS Utility)" (audio)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{389795C2-CD53-4CAF-9403-078961B82614}"
[dshow @ 000001e4ab3c0440] "System Virtual Line (ASUS Utility)" (audio)
[dshow @ 000001e4ab3c0440]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{631D166E-C820-4BE9-9AC4-4A709FE98658}"

 

Настройка записи звука: 

Для записи звука с помощью FFmpeg есть некоторые моменты. Стандартно писать звук не выйдет.  В настройках записи FFmpeg нужно указывать конкретное устройство, с которого будет писаться звук. Для этого нам нужен драйвер Screen.Capturer.Recorder. Его  нужно скачать и установить с github. Ссылка на github. После установки драйвера появится устройство: "virtual-audio-capturer" (audio). Которое мы в скриптах и будем использовать для записи звука. Этот драйвер позволит писать системный звук, - "звук с экрана". Тесть звук с игры или болтовню сопартийцев в мамбле.

Создание скрипта(батника):

Открыть блокнот или Notepad++, вставить туда текст(код скрипта), сохранить. При сохранении выбрать "все файлы", присвоить имя файла с расширением .bat. Пример: запись.bat

Установка ffmpeg

Скрытый текст

Текста много, но все достаточно просто:
1. скачать сборку ffmpeg для Windows и распаковать в удобном месте. Создать в корне диска C папку ffmpeg, перенести сюда содержимое распакованного архива. Ссылка на FFmpeg, качать ffmpeg-git-full.7z(фул сборка)
2.Добавить FFmpeg в переменную среды PATH:
Расскажу на примере Windows 11:
-лкм по мой компьютер - "Свойства"
-"Дополнительные параметры системы".
-Во вкладке "Дополнительно" нажмите на кнопку "Переменные среды".
-В разделе "Переменные среды" найдите переменную среды PATH в списке системных переменных и выберите ее для редактирования.
-Нажмите "Изменить" и добавьте путь к каталогу с исполняемыми файлами FFmpeg (например C:\ffmpeg\bin)
Нажмите "OK", чтобы закрыть все окна.
3.Проверка установки:
-Откройте командную строку и введите команду ffmpeg -version. Если установка прошла успешно, вы увидите информацию о версии FFmpeg.
Теперь FFmpeg должен быть установлен и готов к использованию на вашем компьютере.

Запись видео с помощи ffmpeg,  кодек    h264_nvenc

Скрытый текст

Создаем батник, запускаем, пойдет запись в терминале. Если нужно прекратить запись, просто закрываем терминал. Данный скрипт захватывает экран с частотой 30fps с переменным битрейтом, разрешение будет равно разрешению экрана, кодек NVidia. 
Применяются фильтры для цветокоррекции и стабильности улучшая качества видео. Записанное видео сохраняется в папку D:\video с именем файла, включающим текущую дату и время.

Код скрипта без звука:

Скрытый текст

@echo off
set datetime=%date:/=-%_%time::=-%
set datetime=%datetime: =0%
set datetime=%datetime:.=_%
set datetime=%datetime:~0,19%

rem Путь сохранения видео
if not exist "D:\video\" mkdir "D:\video"

ffmpeg -f gdigrab -framerate 30 -probesize 50M -i desktop ^
  -vf "format=yuv420p,eq=saturation=1.5,unsharp=5:5:1.5,hqdn3d=1.5:1.5:6:6,setpts=PTS/1.001,deshake" ^
  -c:v h264_nvenc -preset fast -qp 18 -b:v 10M -maxrate 30M -bufsize 50M ^
  -g 60 -bf 2 -refs 5 -profile:v high ^
  -fps_mode cfr -fflags +genpts ^
  -r 30 "D:\video\output_%datetime%.mkv"

Описание настроек скрипта:
-if not exist "D:\video\" mkdir "D:\video" - это путь сохранения записанного видео, если такой папки на диске D нет, то скрипт ее создаст.
-f gdigrab: устанавливает формат захвата экрана для Windows.
-framerate 30: задает частоту кадров 30 FPS.
-probesize 100M: устанавливает размер буфера для анализа в 100 мегабайт.
-i desktop: указывает, что входным источником является рабочий стол.
-строка vf: применяет серию фильтров к видеопотоку для улучшения качества (насыщенность, резкость, шумоподавление, стабилизация и др.)
-c:v h264_nvenc: использует аппаратное кодирование H.264 через NVENC.
-preset fast: задает быстрый пресет для кодирования.
-qp 18: задает качество кодирования.
-b:v 10M: задает битрейт в 10 мегабит в секунду.
-maxrate 30M: устанавливает максимальный битрейт в 30 мегабит в секунду.
-bufsize 50M: устанавливает размер буфера в 50 мегабайт.
-g 60: задает интервал ключевых кадров.
-bf 2: устанавливает количество bi-frames.
-refs 5: задает количество ссылок на фреймы.
-profile:v high: использует высокий профиль H.264.
-fps_mode cfr: устанавливает постоянную частоту кадров.
-fflags +genpts: генерирует временные метки.
-r 30: задает выходную частоту кадров 30 FPS.
"D:\video\output_%datetime%.mkv": задает имя выходного файла, включающее текущую дату и время для уникальности.
Код скрипта с записью звука и видео:

Скрытый текст

@echo off
set datetime=%date:/=-%_%time::=-%
set datetime=%datetime: =0%
set datetime=%datetime:.=_%
set datetime=%datetime:~0,19%

rem Check if the output directory exists, create if it doesn't
if not exist "D:\video\" mkdir "D:\video"

rem Run ffmpeg with admin privileges
ffmpeg -f gdigrab -framerate 30 -probesize 50M -i desktop ^
  -f dshow -rtbufsize 1024M -i audio="virtual-audio-capturer" ^
  -vf "scale=1920:1080,unsharp=5:5:1,deshake,eq=saturation=1.2" ^
  -c:v h264_nvenc -pix_fmt yuv420p -cq 18 -preset slow ^
  -b:v 10M -maxrate 25M -bufsize 50M ^
  -c:a aac -b:a 192k ^
  -g 60 -bf 2 -refs 5 -profile:v high -rc-lookahead 20 ^
  -colorspace bt709 -color_primaries bt709 -color_trc bt709 ^
  -fps_mode cfr -async 1 -fflags +genpts ^
  "D:\video\output_%datetime%.mkv"

 

Альтернативный скрипт для записи видео без звука

Скрытый текст
Скрытый текст

@echo off
set datetime=%date:/=-%_%time::=-%
set datetime=%datetime: =0%
set datetime=%datetime:.=_%
set datetime=%datetime:~0,19%

rem Путь сохранения видео
if not exist "D:\video\" mkdir "D:\video"

ffmpeg -f gdigrab -framerate 30 -probesize 50M -i desktop ^
  -vf "format=yuv420p,eq=saturation=1.2,unsharp=5:5:1,deshake" ^
  -c:v h264_nvenc -preset fast -qp 18 ^
  -g 60 -bf 2 -refs 5 -profile:v high ^
  -fps_mode cfr -fflags +genpts ^
  -r 30 "D:\video\output_%datetime%.mkv"

Тут ключевой параметр влияющий на качество это -qp.

Чем ниже значение -qp, тем выше качество и больше размер файла: Более низкие значения -qp приводят к меньшему сжатию и, следовательно, к более высокому качеству изображения, но при этом размер файла будет больше. Например, -qp 18 обеспечит высокое качество, но при этом размер файла будет больше, чем при более высоком значении -qp.

Чем выше значение -qp, тем ниже качество и меньше размер файла: Более высокие значения -qp приводят к большему сжатию и, следовательно, к меньшему размеру файла, но качество изображения становится хуже. Например, при использовании -qp 28 файл будет меньше, но качество изображения будет ниже, чем при -qp 18.
 

Запись видео с помощи ffmpeg,  кодек  h265 (более современный с большей степенью сжатия без потери качества)

Скрытый текст

Код скрипта для записи видео и звука:

Скрытый текст

@echo off
set datetime=%date:/=-%_%time::=-%
set datetime=%datetime: =0%
set datetime=%datetime:.=_%
rem Оставляем только первые 19 символов, чтобы избежать проблем с именами файлов в Windows
set datetime=%datetime:~0,19%

rem Проверяем существование выходной директории, создаем ее, если она не существует
if not exist "D:\video\" mkdir "D:\video"

rem Запускаем ffmpeg
ffmpeg -f gdigrab -framerate 30 -probesize 50M -i desktop ^
  -f dshow -rtbufsize 1024M -i audio="virtual-audio-capturer" ^
  -vf "scale=1920:1080,unsharp=5:5:1,deshake,eq=saturation=1.2" ^
  -c:v hevc_nvenc -preset slow -rc vbr -cq 20 -b:v 20M ^
  -g 60 -refs 5 -profile:v main10 -rc-lookahead 20 ^
  -c:a aac -b:a 192k ^
  -fps_mode cfr -r 30 -async 1 -fflags +genpts ^
  "D:\video\output_%datetime%.mkv"

 

Скрипт для записи с ускорением

Скрытый текст
Скрытый текст

@echo off
set datetime=%date:/=-%_%time::=-%
set datetime=%datetime: =0%
set datetime=%datetime:.=_%
set datetime=%datetime:~0,19%

rem Путь сохранения видео
if not exist "D:\video\" mkdir "D:\video"

ffmpeg -f gdigrab -framerate 30 -probesize 50M -i desktop ^
  -vf "setpts=0.5*PTS,format=yuv420p,eq=saturation=1.2,unsharp=5:5:1,deshake" ^
  -c:v h264_nvenc -preset fast -qp 18 ^
  -g 60 -bf 2 -refs 5 -profile:v high ^
  -fps_mode cfr -fflags +genpts ^
  -r 30 "D:\video\output_%datetime%.mkv"

В этом скрипте фильтр setpts=0.5*PTS, который умножает временные метки кадров на 0.5, что ускоряет видео в два раза. Можно изменить это значение на другое число, чтобы получить другую степень ускорения. Например, setpts=0.25*PTS ускорит видео в четыре раза. Идеально для записи гвг-шки)

 

Обрезка видео

Скрытый текст

1.Нужно перетащить видео на скрипт

2.Указать с какой секунды обрезать

3.Продолжительность обрезки в секундах

Допустим видео 60с, нам нужно обрезать первые 5с и последние 5с. Первый параметр указываем 5, второй 50.

Обрезка происходит без перекодирования с сохранением исходного качества.

Скрытый текст

@echo off
setlocal

REM Установка кодировки UTF-8
chcp 65001 >nul

REM Проверка наличия ffmpeg
where ffmpeg >nul 2>nul
if %errorlevel% neq 0 (
    echo "Ошибка: ffmpeg не найден."
    exit /b
)

REM Проверка наличия входного файла
if "%~1"=="" (
    echo "Ошибка: Пожалуйста, перетащите видеофайл на скрипт."
    pause
    exit /b
)

REM Получение имени входного файла без пути и расширения
for %%I in ("%~1") do (
    set "input_name=%%~nI"
    set "input_ext=%%~xI"
)

REM Ввод пользователем начального времени и длительности
set /p start_time="Введите начальное время обрезки (в формате ЧЧ:ММ:СС.ММ): "
set /p duration="Введите длительность обрезки (в секундах): "

REM Формирование имени выходного файла
set output_name=%input_name%_cut

REM Обрезка видео с заданными параметрами
ffmpeg -ss %start_time% -i "%~1" -t %duration% -c:v copy -c:a copy -avoid_negative_ts 1 "%output_name%%input_ext%"

pause
exit /b

 

Склеивание нескольких видео

Скрытый текст

1.Создаем папку, допустим с именем fraps

2.Кидаем туда видео которые хотим склеить

3.Создаем простой текстовый файл, в который прописываем пути и имя файлов c расширением, которые будем склеивать. Не забываем кавычки как в примере. Очередность склейки файлов видео будет такой, какую вы указали в текстовом файле.

Пример текстового файла:

file 'D:\video\fraps\output_10_06_2024_20-10-51.mkv'
file 'D:\video\fraps\output_10_06_2024_20-10-51_cut.mkv'
file 'D:\video\fraps\output_10_06_2024_20-32-09.mkv'

4.Перетаскиваем созданный текстовый файл на скрипт.

Склеивание произойдет без перекодирования с сохранением исходного качества. Можно добавить и переходы, но нужно будет перекодировать все.

Текст скрипта для склейки:

Скрытый текст

@echo off
setlocal

REM Установка кодировки UTF-8
chcp 65001 >nul

REM Проверка наличия ffmpeg
where ffmpeg >nul 2>nul
if %errorlevel% neq 0 (
    echo "Ошибка: ffmpeg не найден."
    exit /b
)

REM Проверка наличия файла со списком видеофайлов
if "%~1"=="" (
    echo "Ошибка: Пожалуйста, перетащите файл со списком видеофайлов на скрипт."
    pause
    exit /b
)

REM Установка имени выходного файла
set /p output_name="Введите имя выходного файла (без расширения): "
set output_name=%output_name%.mkv

REM Выполнение склейки видео
ffmpeg -f concat -safe 0 -i "%~1" -c copy "%output_name%"

pause
exit /b

 

 

Edited by zuz
Link to comment
Share on other sites

2 часа назад, Капустень сказал:

почему то в начале упущена суть, нафига это? 

Я пока сам не знаю для чего это выложил) Прекрасно понимаю, что все привыкли к стандартным средствам записи и редактирования видео. Суть в том, что можно настроить запись так, что при не большом размере файла получить достойное качество. Залить в ютубчик, и там не потерять в качестве.

Link to comment
Share on other sites

В л2 мы имеем не самый мощный графоний, по сути - ники и чатик бы были четкие, а остальное уж точно будет в норме.

24 минуты назад, zuz сказал:

Залить в ютубчик, и там не потерять в качестве

Так ютуб все равно пережимает видео, он не хранит оригиналы. Там либо vp09, либо av1. Самый простой метод настроить в записи видео изначально большее разрешение, тогда мы получим более-менее нормальную картинку. А можно и не записывать в большем разрешении, а вообще рендерить.

===1080p ====> 2160p =====> 2160p

изначальное   рендерим  заливаем на ютуб.

Ну и битрейт, мы так же можем сделать чуть больший битрейт, чем 50к битрейта для 2к разрешения - но для л2 это уже не такой важный фактор.

Выложи сравнения, во сколько раз сжимает, какое качество картинки получаем и сколько по времени занимает перепаковка.

 

 

Link to comment
Share on other sites

Posted (edited)
3 часа назад, StеrWоzа сказал:

В л2 мы имеем не самый мощный графоний, по сути - ники и чатик бы были четкие, а остальное уж точно будет в норме.

Так ютуб все равно пережимает видео, он не хранит оригиналы. Там либо vp09, либо av1. Самый простой метод настроить в записи видео изначально большее разрешение, тогда мы получим более-менее нормальную картинку. А можно и не записывать в большем разрешении, а вообще рендерить.

===1080p ====> 2160p =====> 2160p

изначальное   рендерим  заливаем на ютуб.

Ну и битрейт, мы так же можем сделать чуть больший битрейт, чем 50к битрейта для 2к разрешения - но для л2 это уже не такой важный фактор.

Выложи сравнения, во сколько раз сжимает, какое качество картинки получаем и сколько по времени занимает перепаковка.

 

 

В общем смотри идею) Для создания "кина" это будет явно сложно и не нужно, для создания фрапса гвг-шки думаю будет норм. Пишем гвг , обрезаем не нужные края видео, склеиваем превьюшку с видео + музычка, получаем готовый фрапс. Все это делается ffmpeg используя скрипты максимально быстро. Далее конвертируем его в 2к тем же ffmpeg, ютуб его хорошо кушает и не портит качество. То что я выложил, это только скрипт записи видео. Настройками фильтров ffmpeg нужно довести запись до состояния, когда тебе в принципе не нужен будет рендер записываемого видео.

Вот есть еще такой вариант скрипта записи. Качество видео можно регулировать одним параметром -qp 18 (чем выше значение, тем ниже качество. 18-баланс)

Пишет примерно с 20к битрейтом. Минута видео +-150мб. 

Попробуй, напиши ощущения. Как по мне, лучше obs

Скрытый текст

@echo off
set datetime=%date:/=-%_%time::=-%
set datetime=%datetime: =0%
set datetime=%datetime:.=_%
set datetime=%datetime:~0,19%

rem Путь сохранения видео
if not exist "D:\video\" mkdir "D:\video"

ffmpeg -f gdigrab -framerate 30 -probesize 50M -i desktop ^
  -vf "format=yuv420p,eq=saturation=1.2,unsharp=5:5:1,deshake" ^
  -c:v h264_nvenc -preset fast -qp 18 ^
  -g 60 -bf 2 -refs 5 -profile:v high ^
  -fps_mode cfr -fflags +genpts ^
  -r 30 "D:\video\output_%datetime%.mkv"

Скрипт конвертации в 2к, битрейт 20к. Нужно просто записанное видео перетащить на скрипт.

Скрытый текст

@echo off
setlocal

REM Проверка наличия ffmpeg
where ffmpeg >nul 2>nul
if %errorlevel% neq 0 (
    echo "Ошибка: ffmpeg не найден."
    exit /b
)

REM Проверка наличия входного файла
if "%~1"=="" (
    echo "Ошибка: Пожалуйста, перетащите видеофайл на скрипт."
    pause
    exit /b
)

REM Получение имени входного файла без пути и расширения
for %%I in ("%~1") do (
    set "input_name=%%~nI"
    set "input_ext=%%~xI"
)

REM Определение параметров для конвертации
set resolution=2560x1440
set bitrate=20M
set maxrate=30M
set bufsize=60M
set framerate=30
set audio_bitrate=320k

REM Формирование имени выходного файла
set output_name=%input_name%_2K

REM Конвертация видео с заданными параметрами
ffmpeg -i "%~1" -vf "scale=%resolution%" -c:v h264 -b:v %bitrate% -maxrate %maxrate% -bufsize %bufsize% -r %framerate% -c:a aac -b:a %audio_bitrate% "%output_name%.mp4"

pause
exit /b

 

Edited by zuz
Link to comment
Share on other sites

Лабка по информатике?

Link to comment
Share on other sites

7 часов назад, zuz сказал:

Как по мне, лучше obs

Я как раз собирался сделать гайд по настройкам ОБС для л2, но как то время еще не нашел.  Там же не только в картинке дело (решается битрейтом) и не в размере файла (ПЗУ сейчас дешевое, я за 5к брал недавно на 1гб м2 ссд), а еще в куче фильтров, слоев, переключения сцен, микшера каналов звука итд. 

Link to comment
Share on other sites

13 часов назад, StеrWоzа сказал:

Я как раз собирался сделать гайд по настройкам ОБС для л2, но как то время еще не нашел.  Там же не только в картинке дело (решается битрейтом) и не в размере файла (ПЗУ сейчас дешевое, я за 5к брал недавно на 1гб м2 ссд), а еще в куче фильтров, слоев, переключения сцен, микшера каналов звука итд. 

Гайд по obs необходим, пиши. Там же можно писать и с помощью ffmpeg тоже). У меня проблема с инетом, заливать гектары в 4к, нет возможности. Да и рендерить это все сутками, то еще удовольствие.



Не много обновил информацию:

-добавил скрипт записи с ускорением, обрезку и склейку.

Link to comment
Share on other sites

22 минуты назад, zuz сказал:

Да и рендерить это все сутками, то еще удовольствие.

GPU рендер приятно удивляет, даже на старой, но не бесполезной 1060

Edited by StеrWоzа
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...