14

Я использую свой FFMPEG с поддержкой моего графического процессора (NVENC) для конвертации файлов из моего спутникового приемника (SD, mpeg2).TS-файлы) в h264 .mp4-файлы

Вот строка, которую я использую

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"

Но качество не так хорошо, как ожидалось. И вся мощь моей системы не используется:

Только 11% GPU и 30% CPU.

Вопрос: Могу ли я сделать несколько улучшений, чтобы улучшить качество при равном размере файла и использовать больше вычислительной мощности моего Geforce GTX 1080?

Я нашел несколько параметров из 林正浩, чтобы изменить, но -preset slow уже должна быть подходом лучшего качества, верно?

2 ответа2

18

Вот примерное руководство по настройке кодера:

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

1. Начните с понимания параметров кодировщика.

Для кодеров на основе NVENC начните с изучения параметров, которые использует каждый кодер (обратите внимание, что я работаю в Linux, поэтому я использую xclip для копирования параметров кодека в буфер обмена перед вставкой их здесь):

(А). Для кодера H.264:

ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip

Выход:

Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
  -preset            <int>        E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... 
     losslesshp                   E..V.... 
  -profile           <int>        E..V.... Set the encoding profile (from 0 to 3) (default main)
     baseline                     E..V.... 
     main                         E..V.... 
     high                         E..V.... 
     high444p                     E..V.... 
  -level             <int>        E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     1b                           E..V.... 
     1.0b                         E..V.... 
     1.1                          E..V.... 
     1.2                          E..V.... 
     1.3                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     2.2                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     3.2                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     4.2                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
  -rc                <int>        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead      <int>        E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces          <int>        E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr               <boolean>    E..V.... Use cbr encoding mode (default false)
  -2pass             <boolean>    E..V.... Use 2pass encoding mode (default auto)
  -gpu               <int>        E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay             <int>        E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut       <boolean>    E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr        <boolean>    E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -b_adapt           <boolean>    E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
  -spatial-aq        <boolean>    E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal-aq       <boolean>    E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency       <boolean>    E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p          <boolean>    E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop        <boolean>    E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength       <int>        E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                <float>      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud               <boolean>    E..V.... Use access unit delimiters (default false)
  -bluray-compat     <boolean>    E..V.... Bluray compatibility workarounds (default false)
  -init_qpP          <int>        E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB          <int>        E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI          <int>        E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                <int>        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred     <int>        E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
  -coder             <int>        E..V.... Coder type (from -1 to 2) (default default)
     default                      E..V.... 
     auto                         E..V.... 
     cabac                        E..V.... 
     cavlc                        E..V.... 
     ac                           E..V.... 
     vlc                          E..V.... 

(Б). Для датчика HEVC/H.265:

ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip

Выход:

Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
  -preset            <int>        E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... lossless
     losslesshp                   E..V.... lossless hp
  -profile           <int>        E..V.... Set the encoding profile (from 0 to 4) (default main)
     main                         E..V.... 
     main10                       E..V.... 
     rext                         E..V.... 
  -level             <int>        E..V.... Set the encoding level restriction (from 0 to 186) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
     5.2                          E..V.... 
     6                            E..V.... 
     6.0                          E..V.... 
     6.1                          E..V.... 
     6.2                          E..V.... 
  -tier              <int>        E..V.... Set the encoding tier (from 0 to 1) (default main)
     main                         E..V.... 
     high                         E..V.... 
  -rc                <int>        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead      <int>        E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces          <int>        E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr               <boolean>    E..V.... Use cbr encoding mode (default false)
  -2pass             <boolean>    E..V.... Use 2pass encoding mode (default auto)
  -gpu               <int>        E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay             <int>        E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut       <boolean>    E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr        <boolean>    E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -spatial_aq        <boolean>    E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal_aq       <boolean>    E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency       <boolean>    E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p          <boolean>    E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop        <boolean>    E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength       <int>        E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                <float>      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud               <boolean>    E..V.... Use access unit delimiters (default false)
  -bluray-compat     <boolean>    E..V.... Bluray compatibility workarounds (default false)
  -init_qpP          <int>        E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB          <int>        E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI          <int>        E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                <int>        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred     <int>        E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)

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

Обратитесь к этому ответу за аппаратными ограничениями, с которыми вы столкнетесь в NVENC, особенно для кодирования HEVC на Pascal.

Затем, используя эту информацию, перейдите к следующему шагу.

3. Синтаксис имеет решающее значение:

Вот порядок, в котором вы должны передавать аргументы в FFmpeg:

(А). Вызовите двоичный файл.

(Б). Передайте любые аргументы в FFmpeg (например, -loglevel напрямую) перед объявлением входных данных.

(С). Если вы используете какое-либо аппаратно-ускоренное декодирование, такое как cuvid , объявите его здесь и включите в него любые конкретные аргументы, которые ему требуются. На этом этапе необходимо упомянуть, что декодеры имеют определенные ограничения, такие как ожидаемое разрешение ввода, поддерживаемые кодеки и т.д., И поэтому рекомендуется в производстве отключить декодеры с аппаратным ускорением, так как это приводит к ошибке на данном этапе. в не удалось кодировать и не подлежит восстановлению. Фактически, разработчики MPV неоднократно упоминали об этом , не полагаясь на аппаратно-ускоренное декодирование для доставки критически важного контента.

(Г). Объявите ваш вклад. Для потоков используйте URL-адрес и, если необходимо, добавьте дополнительные флаги (например, размеры буфера) по мере необходимости. Для локальных ресурсов (в доступной файловой системе) требуется абсолютный путь к файлу.

(Е). При желании вставьте фильтр. Это необходимо для таких функций, как изменение размера, диалоги в формате пикселей, деинтерлейсинг и т.д. Обратите внимание, что в зависимости от используемого здесь фильтра аппаратный декодер (как описано в разделе (с) вводит ограничения, которые ваш фильтр должен иметь возможность обрабатывать, иначе ваш код не удастся.

(Е). Вызовите соответствующие видео- и аудиокодеры и передайте им необходимые аргументы, такие как сопоставления, битрейты, предустановки кодировщика и т.д.

(г). Принимая во внимание, что FFmpeg может вывести требуемый формат вывода файла в зависимости от выбранного расширения выходного файла, рекомендуется явно объявить формат вывода (через параметр -f), чтобы дополнительные параметры могли быть переданы в мультиплексор при необходимости, как это часто бывает с потоковыми форматами, такими как HLS, mpegts и DASH.

(час). Абсолютный путь к выходному файлу.

С вашим примером выше, цитируемым как:

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"

Вы можете повысить его выходное качество, сместив более высокую скорость передачи битов, включив методы кодирования с адаптивным квантованием (поддерживаются методы пространственного и временного AQ, и одновременно может использоваться только один, и обратите внимание, что это также отключает поддержку B-кадров) и путем опциональное включение методов взвешенного прогнозирования, как показано ниже, а также дополнительный фильтр для надлежащего уменьшения масштаба и изменения размера, если это необходимо:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"

В приведенном выше фрагменте предполагается, что входной файл является потоком MPEG2. Если это не так, переключитесь на правильный декодер CUVID после его анализа:

ffprobe -i e:\input.ts

Если это H.264/AVC, измените фрагмент, как показано ниже:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"

Дополнительное примечание по подсчету потоков (передается в ffmpeg через опцию -threads ):

Большее количество потоков кодировщика за пределами определенного порога увеличивает задержку и будет занимать большую площадь памяти для кодирования. Ухудшение качества становится более заметным благодаря большему количеству потоков в режимах с постоянной скоростью передачи битов и режиме почти постоянной скорости передачи битов, называемом VBV (верификатор видеобуфера), из-за увеличенной задержки кодирования. Для ключевых кадров требуется больше данных, чем для других типов кадров, чтобы избежать пульсации некачественных ключевых кадров.

Режим с нулевой задержкой или секционированным потоком не имеет задержки, но этот параметр еще больше ухудшает качество многопоточности в поддерживаемых кодировщиках.

Поэтому целесообразно ограничить число потоков для кодов там, где имеет значение задержка, поскольку воспринимаемая пропускная способность кодера компенсирует любые преимущества, которые он может принести в долгосрочной перспективе.

А так как вы работаете в Windows, вы можете удалить оболочку \ выше, так как я пишу это из коробки Unix, тестирующей приведенную выше команду.

0

Мой опыт использования nvenc заключается в том, что вам нужно сказать ему, какой битрейт вы хотите - по умолчанию VBR, что хорошо, но никакие настройки не компенсируют тот факт, что он всегда хочет дать вам 2M средний битрейт, независимо от того, в каком разрешении вы его кормите. Это похоже на ошибку в кодировщике; он работает предсказуемо во всех остальных отношениях, но для него требуется (например) -b:v 4M для файла 720p или -b:v 8M для 1080p. Вы могли бы, возможно, тоже немного понизить их.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .