Вопрос или проблема
У меня много видео, записанных в OBS, и я хочу получить из ffmpeg такое видео, которое будет совместимо с этими OBS видео для фильтра concat (бесшовная конкатенация).
Настройки кодирования можно найти на скриншотах, fps=30, разрешение=1440×900.
Когда видео из ffmpeg является первым сегментом, оно отображается правильно, если после сегмента OBS – то оно повреждено. Сегменты OBS отображаются правильно независимо от ситуации.
Вот команда, которую я попробовал, чтобы сгенерировать совместимое видео: (с pwsh here-string):
ffmpeg -hide_banner -filter_complex @"
color=c=green:s=1440x900:d=5[xv];
anullsrc=channel_layout=stereo:sample_rate=48000[xa];
[xv]drawtext=text="BLABLABLA":fontcolor=black:fontsize=64:x=(w-text_w)/2:y=(h-text_h)/2[xv];
"@ -map [xv] -map [xa] -c:v hevc_nvenc -preset slow -tune hq -multipass qres -profile:v main -rc cbr -b:v 2500k -c:a aac -r 30 -t 5 rendText.mkv
Вот как я конкатенирую их:
ffmpeg -f concat -safe 0 -i delmeVids.txt -c copy -reset_timestamps 1 -force_key_frames "expr:gte(t,n_forced*1)" concat.mkv
Вот вывод ffprobe для видео из OBS:
Input #0, matroska,webm, from 'OBS-video.mkv':
Metadata:
ENCODER : Lavf60.3.100
Duration: 00:03:14.40, start: 0.000000, bitrate: 2672 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv, bt709), 1440x900 [SAR 1:1 DAR 8:5], 30 fps, 30 tbr, 1k tbn
Metadata:
DURATION : 00:03:14.400000000
Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp
Metadata:
title : Track1
DURATION : 00:03:14.282000000
для видео из FFMPEG:
Input #0, matroska,webm, from 'FFMPEG-VIDEO.mkv':
Metadata:
ENCODER : Lavf61.0.100
Duration: 00:00:05.02, start: -0.021000, bitrate: 32 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv, progressive), 1440x900 [SAR 1:1 DAR 8:5], 30 fps, 30 tbr, 1k tbn
Metadata:
ENCODER : Lavc61.1.101 hevc_nvenc
DURATION : 00:00:05.000000000
Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp
Metadata:
ENCODER : Lavc61.1.101 aac
DURATION : 00:00:05.021000000
hevc-nvenc
параметры для справки:
Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
General capabilities: dr1 delay hardware
Threading capabilities: none
Supported hardware devices: cuda cuda d3d11va d3d11va
Supported pixel formats: yuv420p nv12 p010le yuv444p p016le yuv444p16le bgr0 bgra rgb0 rgba x2rgb10le x2bgr10le gbrp gbrp16le cuda d3d11
hevc_nvenc AVOptions:
-preset <int> E..V....... Установить пресет кодирования (от 0 до 18) (по умолчанию p4)
default 0 E..V.......
slow 1 E..V....... hq 2 прохода
medium 2 E..V....... hq 1 проход
fast 3 E..V....... hp 1 проход
hp 4 E..V.......
hq 5 E..V.......
bd 6 E..V.......
ll 7 E..V....... низкая задержка
llhq 8 E..V....... низкая задержка hq
llhp 9 E..V....... низкая задержка hp
lossless 10 E..V....... без потерь
losslesshp 11 E..V....... без потерь hp
p1 12 E..V....... самый быстрый (низкое качество)
p2 13 E..V....... быстрее (низкое качество)
p3 14 E..V....... быстро (низкое качество)
p4 15 E..V....... среднее (по умолчанию)
p5 16 E..V....... медленно (хорошее качество)
p6 17 E..V....... медленнее (лучшее качество)
p7 18 E..V....... медленнее всего (лучшее качество)
-tune <int> E..V....... Установить информацию о настройках кодирования (от 1 до 5) (по умолчанию hq)
hq 1 E..V....... Высокое качество
uhq 5 E..V....... Ультра высокое качество
ll 2 E..V....... Низкая задержка
ull 3 E..V....... Ультра низкая задержка
lossless 4 E..V....... Без потерь
-profile <int> E..V....... Установить профиль кодирования (от 0 до 4) (по умолчанию main)
main 0 E..V.......
main10 1 E..V.......
rext 2 E..V.......
-level <int> E..V....... Установить ограничение уровня кодирования (от 0 до 186) (по умолчанию auto)
auto 0 E..V.......
1 30 E..V.......
1.0 30 E..V.......
2 60 E..V.......
2.0 60 E..V.......
2.1 63 E..V.......
3 90 E..V.......
3.0 90 E..V.......
3.1 93 E..V.......
4 120 E..V.......
4.0 120 E..V.......
4.1 123 E..V.......
5 150 E..V.......
5.0 150 E..V.......
5.1 153 E..V.......
5.2 156 E..V.......
6 180 E..V.......
6.0 180 E..V.......
6.1 183 E..V.......
6.2 186 E..V.......
-tier <int> E..V....... Установить уровень кодирования (от 0 до 1) (по умолчанию main)
main 0 E..V.......
high 1 E..V.......
-rc <int> E..V....... Переопределить режим управления скоростью (от -1 до INT_MAX) (по умолчанию -1)
constqp 0 E..V....... Режим постоянного QP
vbr 1 E..V....... Режим переменного битрейта
cbr 2 E..V....... Режим постоянного битрейта
vbr_minqp 8388609 E..V....... Режим переменного битрейта с MinQP (устаревший)
ll_2pass_quality 8388609 E..V....... Мультипроход с оптимизацией качества изображения (устаревший)
ll_2pass_size 8388610 E..V....... Мультипроход, оптимизированный для постоянного размера кадра (устаревший)
vbr_2pass 8388609 E..V....... Мультипроход переменного битрейта (устаревший)
cbr_ld_hq 8388610 E..V....... Режим высококачественного постоянного битрейта с низкой задержкой
cbr_hq 8388610 E..V....... Режим высококачественного постоянного битрейта
vbr_hq 8388609 E..V....... Режим высококачественного переменного битрейта
-rc-lookahead <int> E..V....... Число кадров для предварительного просмотра управления скоростью (от 0 до INT_MAX) (по умолчанию 0)
-surfaces <int> E..V....... Число одновременно используемых поверхностей (от 0 до 64) (по умолчанию 0)
-cbr <boolean> E..V....... Использовать режим cbr кодирования (по умолчанию false)
-2pass <boolean> E..V....... Использовать режим 2pass кодирования (по умолчанию auto)
-gpu <int> E..V....... Выбрать, какую GPU с поддержкой NVENC использовать. Первая GPU - 0, вторая - 1 и так далее. (от -2 до INT_MAX) (по умолчанию любая)
any -1 E..V....... Выбрать первое доступное устройство
list -2 E..V....... Перечислить доступные устройства
-rgb_mode <int> E..V....... Настроить, как nvenc обрабатывает упакованный RGB-ввод. (от 0 до INT_MAX) (по умолчанию yuv420)
yuv420 1 E..V....... Конвертировать в yuv420
yuv444 2 E..V....... Конвертировать в yuv444
disabled 0 E..V....... Отключить поддержку, вызвать ошибку.
-delay <int> E..V....... Задержать вывод кадра на указанное количество кадров (от 0 до INT_MAX) (по умолчанию INT_MAX)
-no-scenecut <boolean> E..V....... Когда пересчет кадров включен, установите это значение в 1, чтобы отключить адаптивное вставление I-кадров при нарезке сцен (по умолчанию false)
-forced-idr <boolean> E..V....... Если принудительно вставлять ключевые кадры, вставьте их как I-кадры. (по умолчанию false)
-spatial_aq <boolean> E..V....... Установите значение 1, чтобы включить Spatial AQ (по умолчанию false)
-spatial-aq <boolean> E..V....... Установите значение 1, чтобы включить Spatial AQ (по умолчанию false)
-temporal_aq <boolean> E..V....... Установите значение 1, чтобы включить Temporal AQ (по умолчанию false)
-temporal-aq <boolean> E..V....... Установите значение 1, чтобы включить Temporal AQ (по умолчанию false)
-zerolatency <boolean> E..V....... Установить 1, чтобы указать операцию с нулевой задержкой (без задержки переупорядочивания) (по умолчанию false)
-nonref_p <boolean> E..V....... Установите это значение в 1, чтобы включить автоматическую вставку P-кадров без ссылок (по умолчанию false)
-strict_gop <boolean> E..V....... Установите 1, чтобы минимизировать колебания скорости GOP (по умолчанию false)
-aq-strength <int> E..V....... Когда Spatial AQ включен, это поле используется для указания силы AQ. Масштаб силы AQ от 1 (низкий) до 15 (агрессивный) (от 1 до 15) (по умолчанию 8)
-cq <float> E..V....... Установить целевой уровень качества (от 0 до 51, 0 означает автоматический) для режима постоянного качества в VBR-управлении скоростью (от 0 до 51) (по умолчанию 0)
-aud <boolean> E..V....... Использовать делимитры единицы доступа (по умолчанию false)
-bluray-compat <boolean> E..V....... Обходные пути совместимости Blu-ray (по умолчанию false)
-init_qpP <int> E..V....... Первоначальное значение QP для P-кадров (от -1 до 51) (по умолчанию -1)
-init_qpB <int> E..V....... Первоначальное значение QP для B-кадров (от -1 до 51) (по умолчанию -1)
-init_qpI <int> E..V....... Первоначальное значение QP для I-кадров (от -1 до 51) (по умолчанию -1)
-qp <int> E..V....... Метод контроля скорости параметров квантования (от -1 до 51) (по умолчанию -1)
-qp_cb_offset <int> E..V....... Смещение параметра квантования для канала cb (от -12 до 12) (по умолчанию 0)
-qp_cr_offset <int> E..V....... Смещение параметра квантования для канала cr (от -12 до 12) (по умолчанию 0)
-weighted_pred <int> E..V....... Установить 1 для включения взвешенного предсказания (от 0 до 1) (по умолчанию 0)
-b_ref_mode <int> E..V....... Использовать B-кадры в качестве ссылок (от -1 до 2) (по умолчанию -1)
disabled 0 E..V....... B-кадры не будут использоваться для ссылок
each 1 E..V....... Каждый B-кадр будет использоваться для ссылки
middle 2 E..V....... Только (число B-кадров)/2 будет использоваться для ссылки
-a53cc <boolean> E..V....... Использовать закрытые субтитры A53 (если доступны) (по умолчанию true)
-s12m_tc <boolean> E..V....... Использовать временной код (если доступен) (по умолчанию true)
-dpb_size <int> E..V....... Указывает размер DPB, используемый для кодирования (0 означает автоматический) (от 0 до INT_MAX) (по умолчанию 0)
-multipass <int> E..V....... Установить мультипроходное кодирование (от 0 до 2) (по умолчанию отключено)
disabled 0 E..V....... Один проход
qres 1 E..V....... Включено двухпроходное кодирование, где первый проход - с четвертью разрешения
fullres 2 E..V....... Включено двухпроходное кодирование, где первый проход - с полным разрешением
-ldkfs <int> E..V....... Масштаб ключевого кадра с низкой задержкой; указывает размер увеличения кадра при изменении сцены, допустимый в случае одного кадра VBV и CBR (от 0 до 255) (по умолчанию 0)
-extra_sei <boolean> E..V....... Передать дополнительные данные SEI (например, a53 cc), которые будут включены в битстрим (по умолчанию true)
-udu_sei <boolean> E..V....... Передать данные пользователя незарегистрированного SEI, если доступны (по умолчанию false)
-intra-refresh <boolean> E..V....... Использовать периодическое обновление I вместо I-кадров (по умолчанию false)
-single-slice-intra-refresh <boolean> E..V....... Использовать обновление одиночного среза (по умолчанию false)
-max_slice_size <int> E..V....... Максимальный размер закодированного среза в байтах (от 0 до INT_MAX) (по умолчанию 0)
-constrained-encoding <boolean> E..V....... Включить кодирование ограниченных кадров, при котором каждый срез в ограниченной картине независим от других срезов (по умолчанию false)
-tf_level <int> E..V....... Указывает силу временной фильтрации (от -1 до INT_MAX) (по умолчанию -1)
0 0 E..V.......
4 4 E..V.......
-lookahead_level <int> E..V....... Указывает уровень предварительного просмотра. Более высокий уровень может улучшить качество за счет производительности. (от -1 до 15) (по умолчанию -1)
auto 15 E..V.......
0 0 E..V.......
1 1 E..V.......
2 2 E..V.......
3 3 E..V.......
-unidir_b <boolean> E..V....... Включить использование направленных B-кадров. (по умолчанию false)
-split_encode_mode <int> E..V....... Указывает режим разделенного кодирования (от 0 до 15) (по умолчанию auto)
disabled 15 E..V....... Отключено для всех конфигураций
auto 0 E..V....... Включено или отключено в зависимости от пресета и информации о настройках
forced 1 E..V....... Включено с количеством горизонтальных полос, выбранным драйвером
2 2 E..V....... Включено с количеством горизонтальных полос, принудительно установленным на 2, когда количество NVENC больше 1
3 3 E..V....... Включено с количеством горизонтальных полос, принудительно установленным на 3, когда количество NVENC больше 2
Мне не удалось сгенерировать такое видео, которое было бы совместимо с теми, которые уже были захвачены в OBS, но вот комбинация, которая делает видео совместимыми для бесшовной конкатенации:
Настройки OBS
Генерация видео с помощью FFMPEG
ffmpeg -hide_banner -filter_complex @"
color=c=green:s=2560x1600:d=5[xv];
anullsrc=channel_layout=stereo:sample_rate=48000[xa];
[xv]drawtext=text="BLABLABLA":fontcolor=black:fontsize=64:x=(w-text_w)/2:y=(h-text_h)/2[xv];
"@ -map [xv] -map [xa] -c:v hevc_nvenc -preset fast -profile:v main -b:v 2500k -r 30 -ab 128k -t 5 rendText.mov
Конкатенация видео с помощью FFMPEG
ffmpeg -f concat -safe 0 -i delmeVids.txt -c copy $outFileName
Ответ или решение
Для того чтобы кодировать видео с помощью FFmpeg
так, чтобы оно было совместимо с этими, записанными в OBS
, и можно было применять фильтр concat
без потерь, необходимо убедиться, что параметры кодирования совпадают.
Исходя из предоставленных вами данных о параметрах, используемых в OBS
, мы можем попробовать использовать следующие настройки для кодирования с помощью FFmpeg
:
-
Формат выходного файла: Если ваш поток из
OBS
записывается в формате Matroska (MKV), то лучше использовать тот же формат и дляFFmpeg
. -
Кодек и параметры кодирования:
OBS
использует кодек HEVC, а также определенные параметры. Ваша цель — сделать так, чтобыFFmpeg
использовал эквивалентные настройки. -
Образец команды
FFmpeg
: Вот пример команды, которую вы можете использовать для создания совместимого видео:
ffmpeg -hide_banner -f lavfi -i color=c=green:s=1440x900:d=5 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -filter_complex "[0:v]drawtext=text='BLABLABLA':fontcolor=black:fontsize=64:x=(w-text_w)/2:y=(h-text_h)/2[v];[v][1:a]concat=n=1:v=1:a=1" -c:v hevc_nvenc -preset fast -profile:v main -b:v 2500k -r 30 -c:a aac -b:a 128k -shortest rendText.mkv
Параметры:
-hide_banner
: убирает информацию о конфигурации FFmpeg при запуске.-f lavfi -i color=...
: создает видео с зеленым цветом.-f lavfi -i anullsrc=...
: создает беззвучное аудио.-filter_complex
: описывает фильтр, который накладывает текст на видео и добавляет аудио.-c:v hevc_nvenc
: кодирует видео с использованием NVIDIA NVENC для HEVC.-preset fast
: устанавливает быструю предустановку для кодирования.-profile:v main
: задает профиль кодирования (Main).-b:v 2500k
: устанавливает битрейт видео.-r 30
: устанавливает частоту кадров на 30 fps.-c:a aac
: кодирует аудио с использованием AAC.-b:a 128k
: устанавливает битрейт аудио.-shortest
: завершает кодирование, как только закончится самый короткий поток (в данном случае — видео).
Команда для конкатенации:
После создания совместимого видео, вы можете использовать следующую команду для конкатенации видеофайлов:
ffmpeg -f concat -safe 0 -i delmeVids.txt -c copy -reset_timestamps 1 -force_key_frames "expr:gte(t,n_forced*1)" concat.mkv
Примечания:
- Убедитесь, что все создаваемые видеофайлы имеют одинаковые настройки (разрешение, частота кадров, кодек, профиль и т. д.), чтобы избежать проблем с совместимостью.
- Проверьте, используется ли тот же вариант кодека (например,
Main
профиль) и настройки, используемые для видео, записанного вOBS
. - Если будут выявлены какие-либо проблемы с кодированием или воспроизведением, можно поменять предустановку (
preset
) на более медленную, чтобы улучшить качество видео.
Надеюсь, это поможет вам создать совместимые видеофайлы для дальнейшего редактирования с использованием concat
.