【问题标题】:Nvidia codec SDK samples: can't decode an encoded file correctlyNvidia 编解码器 SDK 示例:无法正确解码编码文件
【发布时间】:2022-10-20 19:02:02
【问题描述】:

我正在尝试Nvidia video codec sdk 中的示例应用程序,但无法获得可用的解码结果。 我的输入文件是 YUV 4:2:0,取自 here,即 352x288px。 我正在使用AppEncD3D12.exe 样本进行编码,使用以下命令:
.\AppEncD3D12.exe -i D:\akiyo_cif.y4m -s 352x288 -o D:\akiyo_out.mp4
这给出了输出

GPU in use: NVIDIA GeForce RTX 2080 Super with Max-Q Design
[INFO ][17:46:39] Encoding Parameters:
        codec        : h264
        preset       : p3
        tuningInfo   : hq
        profile      : (default)
        chroma       : yuv420
        bitdepth     : 8
        rc           : vbr
        fps          : 30/1
        gop          : 250
        bf           : 1
        multipass    : 0
        size         : 352x288
        bitrate      : 0
        maxbitrate   : 0
        vbvbufsize   : 0
        vbvinit      : 0
        aq           : disabled
        temporalaq   : disabled
        lookahead    : disabled
        cq           : 0
        qmin         : P,B,I=0,0,0
        qmax         : P,B,I=0,0,0
        initqp       : P,B,I=0,0,0
Total frames encoded: 112
Saved in file D:\akiyo_out.mp4

这看起来很有希望。但是,使用解码示例,输出的单个帧包含看起来像 12 个较小的单色输入帧。 我正在运行这样的解码示例:

PS D:\Nvidia\Video_Codec_SDK_11.1.5\Samples\build\Debug> .\AppDecD3D.exe -i D:\akiyo_out.mp4
GPU in use: NVIDIA GeForce RTX 2080 Super with Max-Q Design
Display with D3D9.
[INFO ][17:58:58] Media format: raw H.264 video (h264)
Session Initialization Time: 23 ms
[INFO ][17:58:58] Video Input Information
        Codec        : AVC/H.264
        Frame rate   : 30000/1000 = 30 fps
        Sequence     : Progressive
        Coded size   : [352, 288]
        Display area : [0, 0, 352, 288]
        Chroma       : YUV 420
        Bit depth    : 8
Video Decoding Params:
        Num Surfaces : 7
        Crop         : [0, 0, 0, 0]
        Resize       : 352x288
        Deinterlace  : Weave

Total frame decoded: 112
Session Deinitialization Time: 8 ms

我对此很陌生,所以可能会做一些愚蠢的事情。现在我不知道是看编码还是解码!任何想法或提示最受赞赏。

-我尝试了其他 YUV 文件,结果相同。我读到不支持4:2:2,上面是4:2:0。

  • 使用 AppEncCuda 示例,解码后的视频(使用 AppDecD3D.exe 播放)大小和颜色都正确,但视频在播放时似乎向右滚动,颜色信息的滚动速度与图片

【问题讨论】:

    标签: sdk nvidia codec video-encoding


    【解决方案1】:

    你有两个问题:

    1. 根据 AppEncD3D12 示例中的代码和注释,它期望输入帧为 ARGB 格式,但您的输入文件是 YUV - 因此示例从 YUV 文件中读取数据并将其视为 ARGB。如果您希望 AppEncD3D12 使用此文件,您需要将每个 YUV 帧转换为 argb 或更改代码以使用 YUV 作为输入。 AppEncCuda 样本期望 YUV 作为输入,这就是它为您提供更好结果的原因。您还可以看到,在 AppEncD3D12 中共有 112 个编码,但在 AppEncCuda 中共有 300 个帧 - 这是因为 YUV 帧比 ARGB 帧小。
      1. 第二个问题是两个样本都将输出保存为 RAW h264。尽管您给它起了名字,但该文件并不是真正的 MP4。有一些播放器可以播放 h264 RAW 数据文件,您可以尝试使用它们播放输出文件。另一种选择是使用 FFMPEG 创建一个有效的 MP4 文件并将 RAW h264 样本传递给它 - NVIDIA 编码器对视频进行编码,但它不处理视频文件容器的创建(有 2 多种类型的文件,如 avi、mpg、 mp4、mkv、ts 等) - 您应该为此使用 FFMPEG 或其他解决方案。 sdk 示例包含 Utils 文件夹下的文件 FFmpegStreamer.h,该文件显示如何使用 ffmpeg 将 H264 视频以 Mpeg2 传输流格式输出到文件 (*.ts) 或网络。

    【讨论】:

      猜你喜欢
      • 2020-11-26
      • 2017-03-31
      • 2016-10-03
      • 2017-03-01
      • 2016-07-18
      • 2015-08-21
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多