Как кодировать с помощью FFmpeg так же, как в OBS, используя hevc_nvenc?

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

У меня много видео, записанных в 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 1

obs 2

Мне не удалось сгенерировать такое видео, которое было бы совместимо с теми, которые уже были захвачены в OBS, но вот комбинация, которая делает видео совместимыми для бесшовной конкатенации:

Настройки 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:

  1. Формат выходного файла: Если ваш поток из OBS записывается в формате Matroska (MKV), то лучше использовать тот же формат и для FFmpeg.

  2. Кодек и параметры кодирования: OBS использует кодек HEVC, а также определенные параметры. Ваша цель — сделать так, чтобы FFmpeg использовал эквивалентные настройки.

  3. Образец команды 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

Примечания:

  1. Убедитесь, что все создаваемые видеофайлы имеют одинаковые настройки (разрешение, частота кадров, кодек, профиль и т. д.), чтобы избежать проблем с совместимостью.
  2. Проверьте, используется ли тот же вариант кодека (например, Main профиль) и настройки, используемые для видео, записанного в OBS.
  3. Если будут выявлены какие-либо проблемы с кодированием или воспроизведением, можно поменять предустановку (preset) на более медленную, чтобы улучшить качество видео.

Надеюсь, это поможет вам создать совместимые видеофайлы для дальнейшего редактирования с использованием concat.

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

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