【问题标题】:How to use FFMPEG with Nvidia Acceleration (Nvenc) to hardcode / burn in subtitles如何使用带有 Nvidia Acceleration (Nvenc) 的 FFMPEG 对字幕进行硬编码/刻录
【发布时间】:2021-02-18 12:17:55
【问题描述】:

所以我正在尝试使用 Nvenc 来加速视频编码。目的是有 1 个输入视频文件和 1 个输入字幕,并获得不同分辨率的多个输出,字幕硬编码或刻录到视频中。我尝试了多种方法,但不知道该怎么做。

这是我当前使用的命令:

ffmpeg -hwaccel cuvid -i 3030025890-TEST.mp4 -i output_ar.srt  -filter_complex "[0:v]scale_npp=1920:1080, hwdownload,format=nv12[base], [base]subtitles=output_ar.srt[marked]" -map "[marked]" -c:v h264_nvenc -map 0:v:0 -map 0:a:0 -g 50 -b:v 5M -maxrate 5.5M -minrate 4M -bufsize 5M -preset fast 1080_output.mp4

这是输出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '3030025890-TEST.mp4':
  Metadata:
    major_brand     : M4V 
    minor_version   : 1
    compatible_brands: isomavc1mp42
    creation_time   : 2021-01-05T13:45:58.000000Z
  Duration: 00:45:04.28, start: 0.000000, bitrate: 5574 kb/s
    Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 5000 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2021-01-05T13:45:58.000000Z
      handler_name    : ETI ISO Video Media Handler
      encoder         : Elemental H.264
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      creation_time   : 2021-01-05T13:45:58.000000Z
      handler_name    : ETI ISO Audio Media Handler
    Stream #0:2(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      creation_time   : 2021-01-05T13:45:58.000000Z
      handler_name    : ETI ISO Audio Media Handler
    Stream #0:3(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      creation_time   : 2021-01-05T13:45:58.000000Z
      handler_name    : ETI ISO Audio Media Handler
    Stream #0:4(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      creation_time   : 2021-01-05T13:45:58.000000Z
      handler_name    : ETI ISO Audio Media Handler
    Stream #0:5(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      creation_time   : 2021-01-05T13:45:58.000000Z
      handler_name    : ETI ISO Audio Media Handler
    Stream #0:6(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      creation_time   : 2021-01-05T13:45:58.000000Z
      handler_name    : ETI ISO Audio Media Handler
Input #1, srt, from 'output_ar.srt':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Subtitle: subrip
[Parsed_subtitles_3 @ 0x5601070b1dc0] Shaper: FriBidi 0.19.7 (SIMPLE)
Fontconfig error: Cannot load default config file
[Parsed_subtitles_3 @ 0x5601070b1dc0] No usable fontconfig configuration file found, using fallback.
Fontconfig error: Cannot load default config file
[Parsed_subtitles_3 @ 0x5601070b1dc0] Using font provider fontconfig
Stream mapping:
  Stream #0:0 (h264) -> scale_npp (graph 0)
  subtitles (graph 0) -> Stream #0:0 (h264_nvenc)
  Stream #0:0 -> #0:1 (h264 (native) -> h264 (h264_nvenc))
  Stream #0:1 -> #0:2 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[h264 @ 0x56010792f980] Error creating a NVDEC decoder: 1
[h264 @ 0x56010792f980] Failed setup for format cuda: hwaccel initialisation returned error.
[Parsed_subtitles_3 @ 0x560107364cc0] Shaper: FriBidi 0.19.7 (SIMPLE)
Fontconfig error: Cannot load default config file
[Parsed_subtitles_3 @ 0x560107364cc0] No usable fontconfig configuration file found, using fallback.
Fontconfig error: Cannot load default config file
[Parsed_subtitles_3 @ 0x560107364cc0] Using font provider fontconfig
Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
[aac @ 0x56010734d400] Qavg: 65536.000
[aac @ 0x56010734d400] 2 frames left in the queue on closing
Conversion failed!

编辑:取得了一些进展。我现在不再收到错误,但是在查看输出时,没有刻录字幕。 命令:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i 3030025890-TEST.mp4  -c:v h264_nvenc -map 0:v:0 -map 0:a:0 -g 50 -b:v 5M -maxrate 5.5M -minrate 4M -bufsize 5M -vf "scale_npp=1920:1080, hwdownload, format=nv12, subtitles=output_ar.srt, hwupload" -preset fast 1080_output.mp4

【问题讨论】:

    标签: video ffmpeg nvidia subtitle nvenc


    【解决方案1】:

    好的,我已经设法解决了这个问题。我在一个 docker 容器中运行 ffmpeg,这带来了一系列问题。

    1. 如果您使用 linux 并看到诸如“Fontconfig 错误:无法加载默认配置文件”之类的内容,请确保您已安装 fontconfig。在 Ubuntu 上:
    sudo apt-get update -y
    sudo apt-get install -y fontconfig-config
    

    如果您像我一样使用 docker 容器并遇到上述错误,请确保将以下命令添加到您的 dockerfile:

    运行 apt-get update -y
    运行 apt-get install -y fontconfig-config

    1. 如果您计划在 CPU 上运行任何过滤器(GPU 不支持字幕和 libass 等某些过滤器/使用硬件加速),那么您必须下载帧(仅当使用 -hwaccel flag)在解码到您的 RAM 之后,然后再应用过滤器并重新上传到 GPU VRAM。在我的情况下,我不会使用 -hwaccel 标志,因为这使得按照Nvidia's documentation 运行 CPU 绑定过滤器变得更加简单。在我的测试中,它也让事情变得更快。然后过滤器命令变为:

    -vf "subtitles=mysubtitles.srt, hwupload_cuda, scale_npp=1920:1080"

    1. 结合以上几点,你会得到以下命令。请注意缺少 -hwaccel 标志。

    ffmpeg -threads 16 -vsync 0 -c:v h264_cuvid -i 3030025890-TEST.mp4 -c:v h264_nvenc -vf "subtitles=mysubtitles.srt, hwupload_cuda, scale_npp=1920:1080" 1080p_output.mp4 -vf " subtitles=mysubtitles.srt, hwupload_cuda, scale_npp=1280:720" -c:v h264_nvenc -preset fast 720p_output.mp4

    编辑:对上述命令的性能不满意,所以我花了一些时间尝试优化它。我发现您可以使用拆分过滤器拆分输出流。我基本上所做的是使用 GPU 解码,然后下载到 CPU 内存,使用 CPU 应用一次过滤器,将其上传到 GPU,将输出流拆分为 2(一个用于 1080p 输出,另一个用于 720p ) 然后让 GPU 处理缩放 + 编码。与之前的命令相比,这使编码速度提高了 5 倍。

    这是我当前正在使用的命令(请注意,还有其他标志,例如 -g 用于关键帧间隔和 -b:v 用于设置目标比特率,这取决于您的用例可能不是必需的):

    ffmpeg -i Input.mp4 -c:v h264_nvenc -map 0:a:0 -g 50 -b:v 5.0M -maxrate 5.5M -minrate 4.2M -bufsize 4.5M -filter_complex "[0:v] subtitles="mySubs.srt",hwupload_cuda,split=2[c0][c1];[c0]scale_npp=1920:1080[1080];[c1]scale_npp=1280:720[720];" -map "[1080]" -preset fast "1080p_output.mp4" -c:v h264_nvenc -map 0:a:0 -g 50 -b:v 3.4M -maxrate 3.7M -minrate 2.8M -bufsize 3.1M -map “[720]” - 快速预设“720p_output.mp4”

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 2014-09-08
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      相关资源
      最近更新 更多