NVIDIA Jetson Linux 35.3.1-开发指南-Accelerated GStreamer

原文:Accelerated GStreamer — Jetson Linux Developer Guide documentation (nvidia.com)

加速GStreamer

本主题是NVIDIA®Jetson™Linux中包含的基于GStreamer 1.0和1.14版的加速解决方案指南。

对GStreamer 1.0版的引用也适用于GStreamer 1.16版。

GStreamer-1.0安装和设置

本节介绍如何安装和配置GStreamer。

安装GStreamer-1.0

  • 输入命令:

    $ sudo apt-get update
    $ sudo apt-get install gstreamer1.0-tools gstreamer1.0-alsa \
         gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
         gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
         gstreamer1.0-libav
    $ sudo apt-get install libgstreamer1.0-dev \
         libgstreamer-plugins-base1.0-dev \
         libgstreamer-plugins-good1.0-dev \
         libgstreamer-plugins-bad1.0-dev
    

检查GStreamer-1.0版本

  • 输入命令:

    $ gst-inspect-1.0 --version
    

GStreamer-1.0插件参考

gst-omx插件不再支持NVIDIA®Tegra®Linux驱动程序包(现在的JetsonLinux)34.1版。使用gst-v4l2插件进行开发。

GStreamer 1.0版包括以下gst-v4l2视频解码器:

视频解码器

描述

nvv4l2解码器

V4L2 H.265视频解码器

V4L2 H.264视频解码器

V4L2 VP8视频解码器

V4L2 VP9视频解码器

V4L2 MPEG4视频解码器

V4L2 MPEG2视频解码器

V4L2 AV1视频解码器(仅支持NVIDIA®Jetson AGX Orin)

GStreamer 1.0版包括以下gst-v4l2视频编码器:

视频编码器

描述

nvv4l2h264enc

V4L2 H.264视频解码器

nvv4l2h265enc

V4L2 H.265视频编码器

nvv4l2vp9enc

V4L2 VP9视频编码器(仅支持NVIDIA®Jetson Xavier™NX系列和Jetson AGX Xavier系列)

nvv4l2av1enc

V4L2 AV1视频编码器(仅支持NVIDIA®Jetson AGX Orin)

GStreamer 1.0版包括以下EGL™图像视频接收器:

视频接收器

描述

nveglglessink

EGL/GLES视频接收器元素,同时支持X11和Wayland后端

nv3dsink

EGL/GLES视频接收器元素

GStreamer 1.0版包括以下DRM视频接收器:

视频接收器

描述

nvdrmvideo osink

DRM视频接收器元素

GStreamer 1.0版包括以下专有NVIDIA插件:

NVIDIA专有插件

描述

nvarguscamasrc

ARGUS API的相机插件

nvv4l2camasrc

V4L2 API的相机插件

nvvidconv

视频格式转换和缩放

编译器

作曲家视频

nveglstream src

充当GStreamer源组件,接受来自EGLStream生产者的EGLStream

nvvideo osink

视频接收器组件。接受YUV-I420格式并生成EGLStream(RGBA)

nvegl变换

NVMM到EGLimage的视频转换元素(仅支持nveglglessink)

GStreamer 1.0版包含以下基于libjpeg-based 的JPEG映像 视频编码/解码插件:

JPEG格式

描述

nvjpegenc

JPEG编码器元件

nvjpegdec

JPEG解码器元件

在启动视频解码管道之前,请输入以下命令:gst-launchnvgstplayer

$ export DISPLAY=:0

如果X服务器尚未运行,请输入此命令以启动它:

$  xinit &

解码示例

本节中的示例展示了如何使用GStreamer执行音频和视频解码。

使用gst-Launing-1.0的音频解码示例

以下示例展示了如何使用GStreamer-1.0执行音频解码。

  • AAC解码(OSS软件解码):

    $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
       qtdemux name=demux demux.audio_0 ! \
       queue ! avdec_aac ! audioconvert ! alsasink -e
    
  • AMR-WB解码(OSS软件解码):

    $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
         qtdemux name=demux demux.audio_0 ! queue ! avdec_amrwb ! \
         audioconvert ! alsasink -e
    
  • AMR-NB解码(OSS软件解码):

    $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
         qtdemux name=demux demux.audio_0 ! queue ! avdec_amrnb ! \
         audioconvert ! alsasink -e
    
  • MP3解码(OSS软件解码):

    $ gst-launch-1.0 filesrc location=<filename.mp3> ! mpegaudioparse ! \
         avdec_mp3 ! audioconvert ! alsasink -e
    

    要通过HDMI®路由音频,请将alsasink属性device设置为表中为您的平台给定的值 端口到设备ID映射 在主题中 音频设置和开发

    例如,使用device=hw:0,7通过Jetson TX2 HDMI/DP 1(HDMI)端口路由音频。

使用gst-Launing-1.0的视频解码示例

以下示例展示了如何在GStreamer-1.0上执行视频解码。

使用gst-v4l2进行视频解码

以下示例展示了如何使用 GStreamer-1.0 gst-v4l2插件。

  • H.264解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_h264.mp4> ! \
         qtdemux ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e
    

    要启用最大性能模式,请使用gst-v4l2解码器插件的enable-max-performance属性。

    例如:

    $ gst-launch-1.0 filesrc location=<filename_h264.mp4> ! \
         qtdemux ! queue ! h264parse ! nvv4l2decoder \
         enable-max-performance=1 ! nv3dsink -e
    

    要解码H.264/H.265 GDR流,您必须通过将属性enable-frame-type-reporting设置为true来启用错误报告。

    例如:

    $ gst-launch-1.0 filesrc \
         location=<filename_h264.mp4> ! \
         qtdemux ! queue ! h264parse ! nvv4l2decoder \
         enable-frame-type-reporting=1 ! nv3dsink -e
    
  • H.265解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_h265.mp4> ! \
         qtdemux ! queue ! h265parse ! nvv4l2decoder ! nv3dsink -e
    
  • 10位H.265解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_10bit.mkv> ! \
         matroskademux ! queue ! h265parse ! nvv4l2decoder ! \
         nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)NV12' ! \
         nv3dsink -e
    
  • 12位H.265解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_12bit.mkv> ! \
         matroskademux ! queue ! h265parse ! nvv4l2decoder ! \
         nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)NV12' ! \
         nv3dsink -e
    
  • 8位YUV444(NV24)H.265解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_8bit_YUV444.265> ! \
         h265parse ! nvv4l2decoder ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)NV12' ! \
         nv3dsink -e
    
  • VP9解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_vp9.mkv> ! \
         matroskademux ! queue ! nvv4l2decoder ! nv3dsink -e
    
  • VP8解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_vp8.mkv> ! \
         matroskademux ! queue ! nvv4l2decoder ! nv3dsink -e
    
  • MPEG-4解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_mpeg4.mp4> ! \
         qtdemux ! queue ! mpeg4videoparse ! nvv4l2decoder ! nv3dsink -e
    
  • MPEG-4解码DivX 4/5(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_divx.avi> ! \
         avidemux ! queue ! mpeg4videoparse ! nvv4l2decoder ! nv3dsink -e
    
  • MPEG-2解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename_mpeg2.ts> ! \
         tsdemux ! queue ! mpegvideoparse ! nvv4l2decoder ! nv3dsink -e
    
  • AV1解码(NVIDIA加速解码):

    $  gst-launch-1.0 filesrc location = <filename_av1.webm> ! \
         matroskademux ! queue ! nvv4l2decoder ! nv3dsink -e
    
使用gst-Launing-1.0的图像解码示例

以下示例显示了如何在GStreamer-1.0上执行JPEG解码。

  • JPEG解码(NVIDIA加速解码):

    $ gst-launch-1.0 filesrc location=<filename.jpg> ! nvjpegdec ! \
         imagefreeze ! xvimagesink -e
    

编码示例

本节中的示例展示了如何使用GStreamer执行音频和视频编码。

使用gst-Launing-1.0的音频编码示例

以下示例展示了如何在GStreamer-1.0上执行音频编码。

  • AAC编码(OSS软件编码):

    $ gst-launch-1.0 audiotestsrc ! \
         'audio/x-raw, format=(string)S16LE,
         layout=(string)interleaved, rate=(int)44100, channels=(int)2' ! \
         voaacenc ! qtmux ! filesink location=test.mp4 -e
    
  • AMR-WB编码(OSS软件编码):

    $ gst-launch-1.0 audiotestsrc ! \
         'audio/x-raw, format=(string)S16LE, layout=(string)interleaved, \
         rate=(int)16000, channels=(int)1' ! voamrwbenc ! qtmux ! \
         filesink location=test.mp4 -e
    

使用gst-Launing-1.0的视频编码示例

以下示例展示了如何使用GStreamer-1.0执行视频编码。

使用gst-v4l2进行视频编码

以下示例显示了如何使用 gst-v4l2插件与GStreamer-1.0。

  • H.264编码(NVIDIA加速编码):

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvv4l2h264enc ! \
         bitrate=8000000 ! h264parse ! qtmux ! filesink \
         location=<filename_h264.mp4> -e
    

    要启用最大性能模式,请使用gst-v4l2编码器插件的maxperf-enable属性。

    例如:

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvv4l2h264enc \
         maxperf-enable=1 bitrate=8000000 ! h264parse ! qtmux ! filesink \
         location=<filename_h264.mp4> -e
    
  • 8位YUV444(NV24)H.264编码(NVIDIA加速编码):

    $ gst-launch-1.0 filesrc location=<filename_nv24_352_288.yuv>! \
      videoparse width=352 height=288 format=52 framerate=30 ! \
      'video/x-raw, format=(string)NV24' ! nvvidconv ! \
      'video/x-raw(memory:NVMM), format=(string)NV24' ! nvv4l2h264enc \
      profile=High444 ! h264parse ! filesink \
      location=<filename_8bit_nv24.264> -e
    

    High444配置文件支持8位YUV444 H.264编码。

  • H.265编码(NVIDIA加速编码):

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvv4l2h265enc \
         bitrate=8000000 ! h265parse ! qtmux ! filesink \
         location=<filename_h265.mp4> -e
    

    Jetson AGX Xavier和Jetson AGX Orin可以支持8Kp30 H.265编码。例如:

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)3840, \
         height=(int)2160, format=(string)NV12, \
         framerate=(fraction)30/1' ! nvvidconv ! \
         'video/x-raw(memory:NVMM), width=(int)7860, \
         height=(int)4320, format=(string)NV12 ! nvv4l2h265enc \
         preset-level=1 control-rate=1 bitrate=40000000 ! \
         h265parse ! matroskamux ! \
         filesink location=<filename_8k_h265.mkv> -e
    
  • 10位H.265编码(NVIDIA加速编码):

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)P010_10LE' ! \
         nvv4l2h265enc bitrate=8000000 ! h265parse ! qtmux ! \
         filesink location=<filename_10bit_h265.mp4> -e
    
  • 8位YUV444(NV24)H.265编码(NVIDIA加速编码):

    $ gst-launch-1.0 filesrc location=<filename_nv24_352_288.yuv> ! \
      videoparse width=352 height=288 format=52 framerate=30 ! \
      'video/x-raw, format=(string)NV24' ! nvvidconv ! \
      'video/x-raw(memory:NVMM), format=(string)NV24' ! nvv4l2h265enc \
      profile=Main ! h265parse ! filesink location=<filename_8bit_nv24.265> -e
    

    主配置文件支持8位YUV444 H.265编码。

  • VP9编码(NVIDIA加速编码):

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvv4l2vp9enc \
         bitrate=8000000 ! matroskamux ! filesink \
         location=<filename_vp9.mkv> -e
    

    Jetson AGX Orin不支持使用gst-v4l2进行VP9编码。

  • 带有IVF标头的VP9编码(NVIDIA加速编码):

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvv4l2vp9enc \
         enable-headers=1 bitrate=8000000 ! filesink \
         location=<filename_vp9.vp9> -e
    
  • AV1编码(NVIDIA加速编码):

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvv4l2av1enc \
         bitrate=20000000 ! webmmux ! filesink \
         location=<filename_av1.webm> -e
    

    仅支持使用gst-v4l2进行AV1编码的Jetson Orin。

  • 带有IVF标头的AV1编码(NVIDIA加速编码):

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvv4l2av1enc \
         enable-headers=1 bitrate=8000000 ! filesink \
         location=<filename_av1.av1> -e
    

使用gst-Launing-1.0的图像编码示例

以下示例显示了如何在GStreamer-1.0上执行JPEG编码。

  • 图像编码:

    $ gst-launch-1.0 videotestsrc num-buffers=1 ! \
         'video/x-raw, width=(int)640, height=(int)480, \
         format=(string)I420' ! nvjpegenc ! filesink location=test.jpg -e
    

GStreamer-1.0支持的H.264/H.265/VP9/AV1编码器功能

本节介绍NVIDIA加速H.264/H.265/VP9/AV1编码器支持的功能的示例gst-Launing-1.0用法。

使用gst-v4l2支持的功能

本节介绍了NVIDIA 加速 H.264/H.265/VP8/VP9 gst-v4l2 支持的功能的示例 gst-Launing-1.0 用法。

使用以下命令显示有关nvv4l2h264encnvv4l2h265encv4l2vp9encnvv4l2vp8enc的详细信息:

$ gst-inspect-1.0 [nvv4l2h264enc | nvv4l2h265enc | nvv4l2vp9enc | nvv4l2av1enc]
  1. 设置 I-frame 间隔(支持H.264/H.265/VP9/AV1编码):

    $ gst-launch-1.0 videotestsrc num-buffers=300 ! \
         'video/x-raw, width=(int)1280, height=(int)720, \
         format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
         iframeinterval=100 ! h264parse ! qtmux ! filesink \
         location=<filename_h264.mp4> -e
    

此属性设置编码帧内出现频率。

2. 设置速率控制模式和比特率(支持H.264/H.265/VP9/AV1编码):

支持的模式是0(可变码率或VBR)和1(恒定码率或CBR)。

  • 设置可变比特率模式:

    $ gst-launch-1.0 videotestsrc num-buffers=300 ! \
       'video/x-raw, width=(int)1280, height=(int)720, \
       format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
       'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
       control-rate=0 bitrate=30000000 ! h264parse ! qtmux ! filesink \
       location=<filename_h264_VBR.mp4> -e
    

AV1编解码器当前不支持VBR模式。

  • 设置恒定比特率模式:
$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
   'video/x-raw, width=(int)1280, height=(int)720, \
   format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
   'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
   control-rate=1 bitrate=30000000 ! h264parse ! qtmux ! filesink \
   location=<filename_h264_CBR.mp4> -e

3. 设置峰值比特率:

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     bitrate=6000000 peak-bitrate=6500000 ! h264parse ! qtmux ! \
     filesink location=<filename_h264.mp4> -e

峰值码率仅在可变码率模式下生效(control-rate=0)。默认情况下,该值配置为(1.2×比特率)。

4. 为I、P和B帧设置量化参数(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     ratecontrol-enable=0 quant-i-frames=30 quant-p-frames=30 \
     quant-b-frames=30 num-B-Frames=1 ! filesink \
     location=<filename_h264.264> -e

如果B帧数为0,则B帧数的范围不生效。

5. 设置I、P和B帧的量化范围(支持H.264/H.265编码)。范围的格式为:

"<I_range>:<P_range>:<B_range>"

其中<I_range><P_range><B_range>分别以<min>、<max>的形式表示,如本例所示:

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     qp-range="24,24:28,28:30,30" num-B-Frames=1 ! 'video/x-h264, \
     stream-format=(string)byte-stream, alignment=(string)au' ! filesink \
     location=<filename_h264.264> -e

6. 设置硬件预设级别(支持H.264/H.265/VP9/AV1编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     preset-level=4 MeasureEncoderLatency=1 ! 'video/x-h264, \
     stream-format=(string)byte-stream, alignment=(string)au' ! \
     filesink location=<filename_h264.264> -e

支持以下模式:

  • 0:禁用预设。

  • 1:UltraFastPreset。

  • 2:FastPreset:只有整数像素(integer-pel) 估计块运动。对于I/P宏块模式决策,仅比较Intra 16×16成本和模式间成本。支持Intra 16×16和Intra 4×4模式。

  • 3:MediumPreset:最多支持半像素(half-pel) 块运动估计。对于I/P宏块模式决策,仅将Intra 16×16成本与模式间成本进行比较。支持Intra 16×16和Intra 4×4模式。

  • 4:慢速预设:最多支持四分之一像素(Qpel) 块运动估计。对于I/P宏块模式决策,将Intra 4×4和Intra 16×16成本与模式间成本进行比较。支持Intra 16×16和Intra 4×4模式。

AV1编解码器目前仅支持UltraFastPreset和FastPreset。

7. 设置配置文件(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     profile=0 ! 'video/x-h264, stream-format=(string)byte-stream, \
     alignment=(string)au' ! filesink location=<filename_h264.264> -e

H.264编码支持以下配置文件:

  • 0:基线配置

  • 2:主要配置

  • 4:高配置

H.265编码支持以下配置文件:

  • 0:主要配置文件

  • 1:主要10配置

8. 在IDR处插入SPS和PPS(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     insert-sps-pps=1 ! \
     'video/x-h264, stream-format=(string)byte-stream, \
     alignment=(string)au' ! filesink location=<filename_h264.264> -e

如果启用,则在H.264/H.265流中的每个IDR帧之前插入序列参数集(SPS)和图像参数集(PPS)。

9. 启用两通CBR(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     control-rate=1 bitrate=10000000 EnableTwopassCBR=1 ! \
     'video/x-h264, stream-format=(string)byte-stream, \
     alignment=(string)au' ! filesink location=<filename_h264.264> -e

必须启用两通CBR以及恒定码率(control-rate=1)。

对于启用了两遍CBR的多实例编码,请使用gst-v4l2编码器的maxperf启用属性启用max perf模式以实现最佳性能。

10. Slice-header-spacing与宏块方面的行间距(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     slice-header-spacing=8 bit-packetization=0 ! 'video/x-h264, \
     stream-format=(string)byte-stream, alignment=(string)au' ! \
     filesink location=<filename_h264.264> -e

bit-packetization=0参数将网络抽象层(NAL)数据包配置为基于宏块(MB)的,并且slice-header-spacing=8将每个NAL数据包配置为最多8个宏块。

11. 切片标题行间距与行间距的位数(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     slice-header-spacing=1400 bit-packetization=1 ! 'video/x-h264, \
     stream-format=(string)byte-stream, alignment=(string)au' ! \
     filesink location=<filename_h264.264> -e

参数bit-packetization=1将网络抽象层(NAL)数据包配置为基于大小的,并且

slice-header-spacing=1400将每个NAL数据包配置为最大1400字节。

12. 启用CABAC-entropy-coding(支持H.264编码的主要或高配置文件):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     profile=2 cabac-entropy-coding=1 ! 'video/x-h264, \
     stream-format=(string)byte-stream, alignment=(string)au' ! \
     filesink location=<filename_h264.264> -e

支持以下熵编码类型:

  • 0: CAVLC

  • 1: CABAC

13. 设置两个参考帧之间的B帧数量(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
  'video/x-raw, width=(int)1280, height=(int)720, \
  format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
  'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
  num-B-Frames=1 ! 'video/x-h264, stream-format=(string)byte-stream, \
  alignment=(string)au' ! filesink location=<filename_h264.264> -e

此属性设置两个参考帧之间的帧数量。

注:

对于多实例编码,如果num-b-frames=2,请通过指定gst-v4l2编码器的maxperf-enable属性来启用最大性能模式以获得最佳性能。在最大性能模式下,预计功耗会增加。

14. 使用运动矢量元数据(支持h.264/h.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     EnableMVBufferMeta=1 ! 'video/x-h264, \
     stream-format=(string)byte-stream, alignment=(string)au' ! \
     filesink location=<filename_h264.264> -e

15. 设置虚拟缓冲区大小:

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     vbv-size=10 ! h264parse ! qtmux ! \
     filesink location=<filename_h264.mp4> -e

如果解码器的缓冲区大小或网络带宽有限,配置虚拟缓冲区大小可以使视频流生成对应于基于以下公式的限制:

虚拟缓冲区大小=vbv-size×(比特率/fps)

16. 插入AUD(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     insert-aud=1 ! 'video/x-h264, stream-format=(string)byte-stream, \
     alignment=(string)au' ! filesink location=<filename_h264.264> -e

此属性插入H.264/H.265访问单元分隔符(AUD)。

17. 插入VUI(支持H.264/H.265编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=(int)1280, height=(int)720, \
     format=(string)I420, framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc \
     insert-vui=1 ! 'video/x-h264, stream-format=(string)byte-stream, \
     alignment=(string)au' ! filesink location=<filename_h264.264> -e

此属性在SPS中插入H.264/H.265视频可用性信息(VUI)。

18. 设置图片订单计数(POC)类型(支持H.264编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=1920, height=1080, format=I420' ! nvvidconv ! \
     nvv4l2h264enc \
     poc-type=2 ! h264parse ! filesink location=<filename_h264.264> -e

poc类型属性支持以下值:

  • 0:在每个切片标头中明确指定的POC(默认)

  • 2:解码/编码顺序和显示顺序相同

19. 设置禁用CDF更新(支持AV1编码):

$ gst-launch-1.0 videotestsrc num-buffers=300 ! \
     'video/x-raw, width=1920, height=1080, format=I420' ! nvvidconv ! \
     nvv4l2av1enc \
     disable-cdf=0 enable-headers=1 ! filesink location=<filename_av1.av1> -e

20. 设置Tile 配置(支持AV1编码):

  • 对于1x2Tile 配置:

    $ gst-launch-1.0 videotestsrc num-buffers=30 ! \
    'video/x-raw, width=1920, height=1080, format=I420' ! nvvidconv ! \
    nvv4l2av1enc \
    tiles="1,0" bitrate=20000000 ! qtmux ! \
    filesink location= <filename_av1.mp4> -e
    
  • 对于2x1Tile 配置:

    $ gst-launch-1.0 videotestsrc num-buffers=30 ! \
    'video/x-raw, width=1920, height=1080, format=I420' ! nvvidconv ! \
    nvv4l2av1enc \
    tiles="0,1" bitrate=20000000 ! qtmux ! \
    filesink location= <filename_av1.mp4> -e
    
  • 对于2x2Tile 配置:

    $ gst-launch-1.0 videotestsrc num-buffers=30 ! \
    'video/x-raw, width=1920, height=1080, format=I420' ! nvvidconv ! \
    nvv4l2av1enc \
    preset-level=1 tiles="1,1" bitrate=20000000 ! qtmux ! \
    filesink location= <filename_av1.mp4> -e
    

该功能将帧编码为超级宏块,以Log2(行)和Log2(列)作为输入。

21. 设置SSIM RDO(支持AV1编码):

$ gst-launch-1.0 videotestsrc num-buffers=30 ! \
     'video/x-raw, width=1920, height=1080, format=I420' ! nvvidconv ! \
     nvv4l2av1enc \
     enable-srdo=1 ! qtmux ! \
     filesink location= <filename_av1.mp4> -e

使用GStreamer-1.0进行相机捕捉

要显示nvgstcapture-1.0使用信息,请输入以下命令:

$ nvgstcapture-1.0 --help

默认nvgstcapture-1.0应用程序仅支持使用nvarguscamerasrc插件的ARGUS API。不推荐使用旧的nvcamerasrc插件支持。

有关详细信息,请参阅nvgstcappt-1.0参考

使用GStreamer-1.0进行捕获

  1. 使用以下命令通过使用nvarguscamerasrc捕获并使用nvdrmvideosink

    $ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), \
         width=(int)1920, height=(int)1080, format=(string)NV12, \
         framerate=(fraction)30/1' ! queue ! nvdrmvideosink -e
    
    a. 设置接收器的处理期限:
$ gst-launch-1.0 nvarguscamerasrc ! "video/x-raw(memory:NVMM), \
     width=(int)3840, height=(int)2160, format=(string)NV12, \
     framerate=(fraction)60/1" ! nv3dsink processing-deadline=0

由于VIC actmon DFS被实现为按负载处理VIC频率缩放,使客户端能够获得所需的性能,nvarguscamerasrc插件的maxperf属性。

根据GStreamer-1.16发行说明,GstBaseSink获得了一个processing-deadline属性和一个setter/getter API来配置实时管道的处理截止日期。对于捕获用例,添加queue元素或将processing-deadline属性设置为0。

使用nvv4l2camasrc进行渐进式捕获

要使用nv3dsink捕获和预览显示,请输入以下命令:

$ gst-launch-1.0 nvv4l2camerasrc device=/dev/video3 ! \
     'video/x-raw(memory:NVMM), format=(string)UYVY, \
     width=(int)1920, height=(int)1080, \
     interlace-mode= progressive, \
     framerate=(fraction)30/1' ! nvvidconv ! \
     'video/x-raw(memory:NVMM), format=(string)NV12' ! \
     nv3dsink -e

默认nvv4l2camerasrc插件目前仅支持DMABUF(导入器角色)流I/O模式,具有V4L2_MEMORY_DMABUF

nvv4l2camerasrc插件目前使用NVIDIA V4L2驱动程序进行验证,该驱动程序带有支持UYVY格式YUV捕获的传感器。

如果您需要使用不同类型的传感器以其他YUV格式进行捕获,请参阅主题 传感器软件驱动程序编程。 在这种情况下,nvv4l2camerasrc也必须增强所需的YUV格式支持。

nvgstcapture-1.0应用程序使用v4l2src插件来捕获静止图像和视频。

下表显示了USB摄像头支持。

USB摄像头支持

特色

YUV

预览展示

图像捕捉(VGA,640×480)

视频采集(480p、720p、H.264/H.265/VP8/VP9编码)

使用v4l2src捕获原始YUV

使用以下命令使用v4l2src捕获原始YUV(I420格式)并使用xvimagesink预览显示:

$ gst-launch-1.0 v4l2src device="/dev/video0" ! \
     "video/x-raw, width=640, height=480, format=(string)YUY2" ! \
     xvimagesink -e

使用OpenCV支持相机捕获和编码

OpenCV示例应用程序opencv_nvgstcam模拟相机 捕获管道。同样,OpenCV示例应用程序 opencv_nvgstenc模拟视频编码管道。

两个示例应用程序都基于GStreamer 1.0。它们目前仅受OpenCV 3.3版支持。

  • opencv_nvgstcam:相机捕捉和预览。

    要使用opencv_nvgstcam示例应用程序模拟相机捕获管道,请输入以下命令:

    $ ./opencv_nvgstcam --help
    

    目前,opencv_nvgstcam仅支持使用d插件的单实例CSI捕获,您可以通过使用v4l2src插件修改和重建应用程序以支持用于CSI多实例捕获和USB摄像头捕获的GStreamer管道,该应用程序使用基于OpenCV的视频接收器进行显示。

    对于使用OpenCV进行相机CSI捕获和预览渲染,输入th3命令:

    $ ./opencv_nvgstcam --width=1920 --height=1080 --fps=30
    
  • opencv_nvgstenc:相机捕捉和视频编码。

    要使用opencv_nvgstenc示例应用程序模拟相机捕获和视频编码管道,请输入以下命令:

    $ ./opencv_nvgstenc --help
    

    目前,opencv_nvgstenc仅支持使用nvarguscamerasrc插件的相机CSI捕获和通过使用带有MP4容器文件的nvv4l2h264enc插件以H.264格式进行视频编码。您可以修改和重建应用程序以支持不同视频编码格式的GStreamer管道。该应用程序使用基于OpenCV的视频接收器进行显示。

    对于使用OpenCV进行相机CSI捕获和视频编码,输入命令:

    $ ./opencv_nvgstenc --width=1920 --height=1080 --fps=30 --time=60 \
            --filename=test_h264_1080p_30fps.mp4
    

使用GStreamer-1.0播放视频

要显示nvgstplayer-1.0的使用信息,请输入以下命令:

$ nvgstplayer-1.0 --help

视频可以使用Jetson设备上的HDMI连接器输出到HD显示器。GStreamer-1.0应用程序目前支持以下视频接收器:

对于覆盖接收器(全屏模式下覆盖上的视频播放),输入命令:

$ gst-launch-1.0 filesrc location=<filename.mp4> ! \
     qtdemux name=demux ! h264parse ! nvv4l2decoder ! nvdrmvideosink -e

视频播放示例

以下示例展示了如何使用GStreamer-1.0执行视频播放。

  • nveglglessink(窗口视频播放,使用默认X11后端的NVIDIA EGL/GLES视频链接):

    输入此命令以使用默认X11后端的nveglglesink启动GStreamer管道:

    $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
         qtdemux name=demux ! h264parse ! nvv4l2decoder ! nveglglessink -e
    

    nvgstplayer-1.0应用程序接受命令行选项,指定窗口位置和尺寸窗口播放:

    $ nvgstplayer-1.0 -i <filename> --window-x=300 --window-y=300 \
         --window-width=500 --window-height=500
    
  • nveglglessink(窗口视频播放,使用Wayland后端的NVIDIA EGL/GLES视频链接):

    您可以将nveglglsink与Wayland后端一起使用,而不是默认的X11后端。

    Ubuntu 20.04不支持Wayland显示服务器,这意味着没有UI支持从Xorg切换Wayland。在执行基于Weston的操作之前,您必须使用目标的shell启动Wayland服务器(Weston)。

    要启动Weston,请在第一次使用Wayland后端运行GStreamer管道之前完成以下步骤。初始运行后不需要这些步骤。

    开始韦斯顿:

    $ nvstart-weston.sh
    

    要使用Wayland后端运行GStreamer管道,请运行以下命令来启动管道并在Wayland后端使用nveglglesink

    $ gst-launch-1.0 filesrc \
            location=<filename.mp4> ! qtdemux name=demux ! h264parse ! \
            nvv4l2decoder ! nveglglessink winsys=wayland
    
  • nvdrmvideosink(使用DRM播放视频):此接收器元素使用DRM在连接的显示器上呈现视频。

    必须停止显示驱动程序,并且必须在使用nvdrmvideosink之前加载DRM驱动程序。

    停止显示管理器:

    $ sudo systemctl stop gdm
    $ sudo loginctl terminate-seat seat0
    

    加载DRM驱动程序:

    For Jetson Xavier use
    $ sudo modprobe tegra_udrm modeset=1
    
    For Jetson Orin use
    $ sudo modprobe nvidia-drm modeset=1
    

    要使用nvdrmvideosink启动GStreamer管道,请运行以下命令:

    $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
         qtdemux! queue ! h264parse ! nvv4l2decoder ! nvdrmvideosink -e
    

    nvdrmvideosink支持这些属性

    • conn_id:设置显示器的连接器ID。

    • plane_id:设置飞机ID。

    • set_mode:设置播放的默认模式(分辨率)。

    以下命令说明了这些属性的使用:

    $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
         qtdemux! queue ! h264parse ! ! nvv4l2decoder ! nvdrmvideosink \
         conn_id=0 plane_id=1 set_mode=0 -e
    
  • nv3dsink视频接收器(使用3D图形API播放视频):此视频接收器元素与NVMM缓冲区一起工作,并使用3D图形渲染API进行渲染。它的性能优于带有NVMM缓冲区的nveglglessink

    此命令使用nv3dsink启动GStreamer管道:

    $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
         qtdemux ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e
    

    接收器支持使用此示例中显示的属性设置特定的窗口位置和尺寸:

    $ nv3dsink window-x=300 window-y=300 window-width=512 window-height=512
    

使用OpenCV支持视频解码

您可以使用基于GStreamer-1.0的模拟视频解码管道 OpenCV示例应用程序opencv_nvgstdec

示例应用程序目前仅在OpenCV 3.3版中运行。

要使用opencv_nvgstdec执行视频解码,请输入以下命令:

$ ./opencv_nvgstdec --help

目前,opencv_nvgstdec仅支持使用nvv4l2decoder插件的H264格式的视频解码。您可以修改和重建应用程序以支持不同格式视频解码的GStreamer管道。对于显示,该应用程序利用基于OpenCV的视频接收器组件。

要使用opencv_nvgstdec执行视频解码,请输入以下命令:

$ ./opencv_nvgstdec --file-path=test_file_h264.mp4

使用GStreamer-1.0进行视频流

本节介绍使用GStreamer 1.0进行视频流传输的过程。

使用nvgstplayer-1.0执行视频流

  • 使用nvgstplayer-1.0:输入命令:

    $ nvgstplayer-1.0 -i rtsp://10.25.20.77:554/RTSP_contents/VIDEO/H264/
         test_file_h264.3gp –stats
    

    支持的视频流格式有:

    MPEG4MPEG4+AACMPEG4+AAC PLUSMPEG4+eAAC PLUSMPEG4+AMR-NBMPEG4+AMR-WB
    H263H263+AACH263+AAC PLUSH263+AMR-NBH263+AMR-WB
    H264H264+AACH264+AAC PLUSH264+eAAC PLUSH264+AMR-NBH264+AMR-WB
    AACAAC PLUSeAAC PLUSAMR-NBAMR-WB
  • 使用gst-Launing-1.0管道:

    • 流媒体和视频渲染:

      • 传输(从目标):CSI相机捕获+视频编码+使用网络接收器的RTP流:

        $ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), \
             format=NV12, width=1920, height=1080' ! \
             nvv4l2h264enc insert-sps-pps=true ! h264parse ! \
             rtph264pay pt=96 ! udpsink host=127.0.0.1 port=8001 sync=false -e
        
      • 接收(在目标上):网络源+视频解码+视频渲染:

        $ gst-launch-1.0 udpsrc address=127.0.0.1 port=8001 \
             caps='application/x-rtp, encoding-name=(string)H264, payload=(int)96' ! \
             rtph264depay ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e
        
    • 流式传输和文件转储:

      • 传输(从目标):CSI相机捕获+视频编码+使用网络接收器的RTP流:

        $ gst-launch-1.0 nvarguscamerasrc ! \
             'video/x-raw(memory:NVMM), format=NV12, width=1920, height=1080' ! \
             nvv4l2h264enc insert-sps-pps=true ! h264parse ! \
             rtph264pay pt=96 ! udpsink host=127.0.0.1 port=8001 sync=false -e
        
      • 接收(在目标上):网络源+视频解码+文件转储:

        $ gst-launch-1.0 udpsrc address=127.0.0.1 port=8001 \
             caps='application/x-rtp, encoding-name=(string)H264, payload=(int)96' ! \
             rtph264depay ! queue ! h264parse ! nvv4l2decoder ! nvvidconv ! \
             'video/x-raw, format=(string)I420' ! filesink location=test.yuv -e
        

使用GStreamer-1.0进行视频格式转换

NVIDIA专有的nvvidconvGStreamer-1.0插件允许在OSS(原始)视频格式和NVIDIA视频格式之间进行转换。nvvidconv插件目前支持本节中描述的格式转换。

原始YUV输入格式

目前基于VIC的nvvidconvon Jetson支持I420UYVYYUY2YVYUNV12NV16NV24P010_10LEGRAY8BGRxRGBAY42B RAW-YUV输入格式和基于CUDA的nvvidconvon GPU支持I420NV12P010_10LEGRAY8BGRxRGBA输入格式。

输入以下命令以在JetsonLinux上执行基于VIC的转换:

  • 使用gst-v4l2编码器(除了GRAY8管道):

    $ gst-launch-1.0 videotestsrc ! 'video/x-raw, format=(string)UYVY, \
         width=(int)1280, height=(int)720' ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)I420' ! \
         nvv4l2h264enc ! 'video/x-h264, \
         stream-format=(string)byte-stream' ! h264parse ! \
         qtmux ! filesink location=test.mp4 -e
    
  • gst-v4l2编码器与GRAY8管道一起使用:

    $ gst-launch-1.0 videotestsrc ! 'video/x-raw, format=(string)GRAY8, \
         width=(int)640, height=(int)480, framerate=(fraction)30/1' ! \
         nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! \
         nvv4l2h264enc ! 'video/x-h264, \
         stream-format=(string)byte-stream' ! h264parse ! qtmux ! \
         filesink location=test.mp4 -e
    

输入以下命令以在集成GPU上执行基于CUDA的转换:

gst-v4l2编码器不支持CUDA内存,所以使用GPU的第一个nvvidconv的输出通过VIC转换为表面阵列内存。

  • 使用gst-v4l2编码器(除了GRAY8管道):

    $ gst-launch-1.0 videotestsrc ! 'video/x-raw, format=(string)NV12, \
         width=(int)1280, height=(int)720' ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! 'video/x-raw, \
         format=(string)I420' ! nvvidconv compute-hw=VIC \
         nvbuf-memory-type=nvbuf-mem-surface-array ! 'video/x-raw(memory:NVMM)' ! \
         nvv4l2h264enc ! 'video/x-h264, \
         stream-format=(string)byte-stream' ! h264parse ! \
         qtmux ! filesink location=test.mp4 -e
    
  • gst-v4l2编码器与GRAY8管道一起使用:

    $ gst-launch-1.0 videotestsrc ! 'video/x-raw, format=(string)GRAY8, \
         width=(int)640, height=(int)480, framerate=(fraction)30/1' ! \
         nvvidconv compute-hw=GPU nvbuf-memory-type=nvbuf-mem-cuda-device ! \
         'video/x-raw, format=(string)I420' ! nvvidconv compute-hw=VIC \
         nvbuf-memory-type=nvbuf-mem-surface-array ! 'video/x-raw(memory:NVMM)' ! \
         nvv4l2h264enc ! 'video/x-h264, \
         stream-format=(string)byte-stream' ! h264parse ! qtmux ! \
         filesink location=test.mp4 -e
    

输入以下命令以在专用GPU上执行基于CUDA的格式转换:

gst-v4l2编码器可以直接使用专用GPU上的CUDA内存。

  • 使用gst-v4l2编码器:

    $ gst-launch-1.0 filesrc location=input_4k_60p.yuv ! videoparse width=3840 \
         height=2160 format=i420 framerate=60 ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! 'video/x-raw(memory:NVMM), \
         width=(int)3840, height=(int)2160, format=(string)I420, framerate=60/1' ! \
         nvv4l2h264enc ! 'video/x-h264, stream-format=(string)byte-stream, \
         alignment=(string)au' ! h264parse ! qtmux ! \
         filesink location=test.mp4 -e
    

由于涉及“软件到硬件”内存副本,使用原始YUV输入的格式转换是CPU密集型的。

原始YUV输出格式

目前基于VIC的nvvidconv支持I420UYVYYUY2YVYUNV12NV16NV24GRAY8BGRxRGBAY42B RAW-YUV输出格式,基于GPU的CUDAnvvidconv支持I420NV12P010_10LEI420_10LEGRAY8BGRxRGBA输出格式。

输入以下命令以在JetsonLinux上执行基于VIC的格式转换:

  • 使用gst-v4l2解码器(除了GRAY8管道):

    $ gst-launch-1.0 filesrc location=640x480_30p.mp4 ! qtdemux ! \
         queue ! h264parse ! nvv4l2decoder ! nvvidconv ! \
         'video/x-raw, format=(string)UYVY' ! videoconvert ! xvimagesink -e
    
  • gst-v4l2解码器与GRAY8管道一起使用:

    $ gst-launch-1.0 filesrc location=720x480_30i_MP.mp4 ! qtdemux ! \
         queue ! h264parse ! nvv4l2decoder ! nvvidconv ! 'video/x-raw, \
         format=(string)GRAY8' ! videoconvert ! xvimagesink -e
    

输入以下命令以在集成GPU上执行基于CUDA的格式转换:

  • 使用gst-v4l2解码器:

    $ gst-launch-1.0 filesrc location=640x480_30p.mp4 ! qtdemux ! \
         queue ! h264parse ! nvv4l2decoder ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! nv3dsink -e
    

输入以下命令以在专用GPU上执行基于CUDA的格式转换:

  • 使用gst-v4l2解码器:

    $ gst-launch-1.0 filesrc location=720x480_30i_MP.mp4 ! qtdemux ! \
         h264parse ! nvv4l2decoder cudadec-memtype=1 ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! nveglglessink -e
    

由于涉及“硬件到软件”内存副本,使用原始YUV输出的格式转换是CPU密集型的。

NVIDIA输入和输出格式

目前基于GPU的CUDAnvvidconv支持I420NV12P010_10LEGRAY8BGRxRGBA输入格式,并支持I420NV12P010_10LEI420_10LEGRAY8BGRxRGBA输出格式和基于VIC的nvvidconv支持下表中描述的NVIDIA输入和输出格式的组合。左侧列中的任何格式都可以转换为右侧列中同一行中的任何格式。

NV12
NV24
NV16NV12
NV24
NV16
I420
I420_12LE
I420_10LE
P010_10LE
I420I420_10LE
P010_10LE
UYVY
YVYU
BGRx
GRAY8
YUY2
Y42B
RGBA
UYVY
YVYU
BGRx
GRAY8
YUY2
Y42B
RGBA

输入以下命令,在JetsonLinux上执行基于VIC的NVIDIA格式转换:

  • 使用gst-v4l2解码器:

    $ gst-launch-1.0 filesrc location=1280x720_30p.mp4 ! qtdemux ! \
         h264parse ! nvv4l2decoder ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)RGBA' ! nvdrmvideosink -e
    
  • 使用gst-v4l2编码器:

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc ! \
         h264parse ! qtmux ! filesink location=test.mp4 -e
    
  • gst-v4l2解码器和nv3dsink与GRAY8管道一起使用:

    $ gst-launch-1.0 filesrc location=1280x720_30p.mp4 ! qtdemux ! \
         h264parse ! nvv4l2decoder ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)GRAY8' ! nvvidconv ! \
         'video/x-raw(memory:NVMM), format=(string)I420' ! nv3dsink -e
    

输入以下命令以在集成GPU上执行基于CUDA的NVIDIA格式之间的转换:

  • 使用gst-v4l2解码器:

    $ gst-launch-1.0 filesrc location=1280x720_30p.mp4 ! qtdemux ! \
         h264parse ! nvv4l2decoder ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! \
         'video/x-raw(memory:NVMM), format=(string)RGBA' ! nv3dsink -e
    

gst-v4l2编码器不支持CUDA内存,所以使用GPU的第一个nvvidconv的输出通过VIC转换为表面阵列内存。

  • 使用gst-v4l2编码器:

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=(fraction)30/1' ! \
         nvvidconv compute-hw=GPU nvbuf-memory-type=nvbuf-mem-cuda-device ! \
         'video/x-raw, format=(string)I420' ! \
         nvvidconv compute-hw=VIC nvbuf-memory-type=nvbuf-mem-surface-array ! \
         'video/x-raw(memory:NVMM)' ! nvv4l2h264enc ! \
         h264parse ! qtmux ! filesink location=test.mp4 -e
    
  • gst-v4l2解码器和nv3dsink与GRAY8管道一起使用:

    $ gst-launch-1.0 filesrc location=1280x720_30p.mp4 ! qtdemux ! \
         h264parse ! nvv4l2decoder ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! \
         'video/x-raw(memory:NVMM), format=(string)GRAY8' ! \
         nvvidconv compute-hw=GPU nvbuf-memory-type=nvbuf-mem-cuda-device ! \
         'video/x-raw(memory:NVMM), format=(string)I420' ! nv3dsink -e
    

输入以下命令以在专用GPU上执行基于CUDA的NVIDIA格式之间的转换:

gst-v4l2编码器可以直接使用专用GPU上的CUDA内存。

  • 使用gst-v4l2编码器:

    $ gst-launch-1.0 filesrc location=input_4k_60p_NV12.yuv ! videoparse width=3840 \
         height=2160 format=23 framerate=60 ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! 'video/x-raw(memory:NVMM), \
         width=(int)3840, height=(int)2160, format=(string)I420, framerate=60/1' ! \
         nvv4l2h264enc ! 'video/x-h264, stream-format=(string)byte-stream, \
         alignment=(string)au' ! h264parse ! qtmux ! \
         filesink location=test.mp4 -e
    
  • 使用gst-v4l2解码器:

    $ gst-launch-1.0 filesrc location=1280x720_30p.mp4 ! qtdemux ! \
         h264parse ! nvv4l2decoder cudadec-memtype=1 ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! 'video/x-raw(memory:NVMM), \
         width=1280, height=720, format=(string)I420 ! nveglglessink -e
    

使用GStreamer-1.0进行视频缩放

NVIDIA专有的nvvidconvGStreamer-1.0插件还允许您 执行视频缩放。nvvidconv插件当前支持缩放 使用本节中描述的格式转换。

  • 原始YUV输入格式:

    目前基于VIC的nvvidconvon Jetson支持I420、UYVY、YUY2、YVYU、NV12、NV16、NV24、P010_10LE、GRAY8、BGRx、RGBA和Y42BRAW-YUV输入格式用于缩放,基于CUDA的nvvidconvGPU支持I420、NV12、P010_10LE、GRAY8、BGRx和RGBA输入格式用于缩放。

    • 使用gst-v4l2编码器并在JetsonLinux上执行基于VIC的缩放:

      $ gst-launch-1.0 videotestsrc ! \
           'video/x-raw, format=(string)I420, width=(int)1280, \
           height=(int)720' ! nvvidconv ! \
           'video/x-raw(memory:NVMM), width=(int)640, height=(int)480, \
           format=(string)I420' ! nvv4l2h264enc ! \
           'video/x-h264, stream-format=(string)byte-stream' ! h264parse ! \
           qtmux ! filesink location=test.mp4 -e
      

    gst-v4l2编码器不支持CUDA内存,所以使用GPU的第一个nvvidconv的输出通过VIC转换为表面阵列内存。

    • 使用gst-v4l2编码器并在集成GPU上执行基于CUDA的扩展:

      $ gst-launch-1.0 videotestsrc ! \
           'video/x-raw, format=(string)I420, width=(int)1280, \
           height=(int)720' ! nvvidconv compute-hw=GPU \
           nvbuf-memory-type=nvbuf-mem-cuda-device ! \
           'video/x-raw, width=(int)640, height=(int)480, \
           format=(string)I420' ! nvvidconv compute-hw=VIC \
           nvbuf-memory-type=nvbuf-mem-surface-array ! \
           'video/x-raw(memory:NVMM)' ! nvv4l2h264enc ! \
           'video/x-h264, stream-format=(string)byte-stream' ! h264parse ! \
           qtmux ! filesink location=test.mp4 -e
      

    gst-v4l2编码器可以直接使用专用GPU上的CUDA内存。

    • 使用gst-v4l2编码器并在专用GPU上执行基于CUDA的扩展:

      $ gst-launch-1.0 filesrc location=input_4k_60p.yuv ! videoparse width=3840 \
           height=2160 format=i420 framerate=60 ! nvvidconv compute-hw=GPU \
           nvbuf-memory-type=nvbuf-mem-cuda-device ! 'video/x-raw(memory:NVMM), \
           width=(int)1920, height=(int)1080, format=(string)I420, framerate=60/1' ! \
           nvv4l2h264enc ! 'video/x-h264, stream-format=(string)byte-stream, \
           alignment=(string)au' ! h264parse ! qtmux ! \
           filesink location=test.mp4 -e
      

由于涉及“软件到硬件”内存副本,使用原始YUV输入的视频缩放是CPU密集型的。

  • 原始YUV输出格式:

    目前Jetson上基于VIC的nvvidconv支持I420、UYVY、YUY2、YVYU、NV12、NV16、NV24、GRAY8、BGRx、RGBA和Y42B用于缩放的RAW-YUV输出格式,GPU上基于CUDA的nvvidconv支持I420、NV12、GRAY8、BGRx、RGBA和I420_10LE输出格式进行缩放。

    • 使用gst-v4l2解码器并在JetsonLinux上执行基于VIC的缩放:

      $ gst-launch-1.0 filesrc location=1280x720_30p.mp4 ! qtdemux ! \
           queue ! h264parse ! nvv4l2decoder ! nvvidconv ! \
           'video/x-raw, format=(string)I420, width=640, height=480' ! \
           xvimagesink -e
      
    • 使用gst-v4l2解码器并在集成GPU上执行基于CUDA的缩放:

      $ gst-launch-1.0 filesrc location=1280x720_30p.mp4 ! qtdemux ! \
           queue ! h264parse ! nvv4l2decoder ! nvvidconv compute-hw=GPU \
           nvbuf-memory-type=nvbuf-mem-cuda-device ! \
           'video/x-raw, format=(string)I420, width=640, height=480' ! \
           nv3dsink -e
      
    • 使用gst-v4l2解码器并在专用GPU上执行基于CUDA的缩放:

      $ gst-launch-1.0 filesrc location = 1280x720_30p.mp4 ! qtdemux ! \
           h264parse ! nvv4l2decoder cudadec-memtype=1 ! nvvidconv compute-hw=GPU \
           nvbuf-memory-type=nvbuf-mem-cuda-device ! 'video/x-raw(memory:NVMM), \
           width=640, height=480' ! nveglglessink -e
      

由于涉及“硬件到软件”内存副本,使用原始YUV输出的视频缩放是CPU密集型的。

使用GStreamer-1.0进行视频裁剪

NVIDIA专有的nvvidconvGStreamer-1.0插件还允许您 执行视频裁剪:

  • 使用gst-v4l2解码器并在JetsonLinux上执行基于VIC的裁剪:

    $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! qtdemux ! \
         h264parse ! nvv4l2decoder ! \
         nvvidconv left=400 right=1520 top=200 bottom=880 ! nv3dsink -e
    
  • 使用gst-v4l2解码器并在集成GPU上执行基于CUDA的裁剪:

    $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! qtdemux ! \
         h264parse ! nvv4l2decoder ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device \
         left=400 right=1520 top=200 bottom=880 ! nv3dsink -e
    
  • 使用gst-v4l2解码器并在专用GPU上执行基于CUDA的裁剪:

    $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! qtdemux ! \
         h264parse ! nvv4l2decoder cudadec-memtype=1 ! nvvidconv compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device \
         left=400 right=1520 top=200 bottom=880 ! nveglglessink -e
    

使用GStreamer-1.0进行视频转码

您可以在以下视频格式之间执行视频转码。

  • H.264解码到VP9编码(NVIDIA加速解码到NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! qtdemux ! \
           h264parse ! nvv4l2decoder ! nvv4l2vp9enc !matroskamux name=mux ! \
           filesink location=<Transcoded_filename.mkv> -e
      
  • H.265解码为VP9编码(NVIDIA加速解码为NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux demux.video_0 ! queue ! h265parse ! nvv4l2decoder ! \
           nvv4l2vp9enc bitrate=20000000 ! queue ! matroskamux name=mux ! \
           filesink location=<Transcoded_filename.mkv> -e
      
  • VP8解码为H.264编码(NVIDIA加速解码为NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mebm> ! \
           matroskademux name=demux demux.video_0 ! queue ! nvv4l2decoder ! \
           nvv4l2h264enc bitrate=20000000 ! h264parse ! queue ! \
           qtmux name=mux ! filesink location=<Transcoded_filename.mp4> -e
      
  • VP9解码为H.265编码(NVIDIA加速解码为NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.webm> ! \
           matroskademux name=demux demux.video_0 ! queue ! nvv4l2decoder ! \
           nvv4l2h265enc bitrate=20000000 ! h265parse ! queue ! \
           qtmux name=mux ! filesink location=<Transcoded_filename.mp4> -e
      
  • MPEG-4解码为VP9编码(NVIDIA加速解码为NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux demux.video_0 ! queue ! mpeg4videoparse ! \
           nvv4l2decoder ! nvv4l2vp9enc bitrate=20000000 ! queue ! \
           matroskamux name=mux ! filesink \
           location=<Transcoded_filename.mkv> -e
      
  • MPEG-4解码为H.264编码(NVIDIA加速解码为NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux demux.video_0 ! queue ! mpeg4videoparse ! \
           nvv4l2decoder ! nvv4l2h264enc bitrate=20000000 ! h264parse ! \
           queue ! qtmux name=mux ! filesink \
           location=<Transcoded_filename.mp4> -e
      
  • H.264解码为AV1编码(NVIDIA加速解码为NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux demux.video_0 ! queue ! h264parse ! \
           nvv4l2decoder ! nvv4l2av1enc bitrate=20000000 ! queue ! \
           matroskamux name=mux ! \
           filesink location=<Transcoded_filename.mkv> -e
      
  • H.265解码为AV1编码(NVIDIA加速解码为NVIDIA加速编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux demux.video_0 ! queue ! h265parse ! \
           nvv4l2decoder ! nvv4l2av1enc bitrate=20000000 ! queue ! \
           matroskamux name=mux ! \
           filesink location=<Transcoded_filename.mkv> -e
      
  • VP8解码为MPEG-4编码(NVIDIA加速解码为OSS软件编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mkv> ! \
           matroskademux name=demux demux.video_0 ! queue ! nvv4l2decoder ! \
           nvvidconv ! avenc_mpeg4 bitrate=4000000 ! queue ! \
           qtmux name=mux ! filesink location=<Transcoded_filename.mp4> -e
      
  • VP9解码为MPEG-4编码(NVIDIA加速解码为OSS软件编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mkv> ! \
           matroskademux name=demux demux.video_0 ! queue ! nvv4l2decoder ! \
           nvvidconv ! avenc_mpeg4 bitrate=4000000 ! qtmux name=mux ! \
           filesink location=<Transcoded_filename.mp4> -e
      
  • H.264解码到Theora编码(NVIDIA加速解码到OSS软件编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux demux.video_0 ! queue ! h264parse ! \
           nvv4l2decoder ! nvvidconv ! theoraenc bitrate=4000000 ! \
           oggmux name=mux ! filesink location=<Transcoded_filename.ogg> -e
      
  • H.264解码为H.263编码(NVIDIA加速解码为OSS软件编码):

    • 使用gst-v4l2管道:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux demux.video_0 ! queue ! h264parse ! \
           nvv4l2decoder ! nvvidconv ! \
         '  video/x-raw, width=(int)704, height=(int)576, \
         for  mat=(string)I420' ! avenc_h263 bitrate=4000000 ! qtmux ! \
         files  ink location=<Transcoded_filename.mp4> -e
      

使用GStreamer-1.0进行CUDA视频后处理

本节介绍用于NVIDIA®CUDA®后处理操作的GStreamer-1.0插件。

gst-nvivafilter

这个NVIDIA专有的GStreamer-1.0插件执行前/后和CUDA 对CSI相机捕获或解码的帧进行后处理操作,以及 使用覆盖视频接收器或视频编码渲染视频。 …注意:: gst-nvivafilter管道要求在停止lightdm时使用命令unset DISPLAY取消设置DISPLAY环境变量。

  • 示例解码管道:

    • 使用gst-v4l2解码器:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! qtdemux ! queue ! \
           h264parse ! nvv4l2decoder ! nvivafilter cuda-process=true \
           customer-lib-name="libnvsample_cudaprocess.so" ! \
           'video/x-raw(memory:NVMM), format=(string)NV12' ! \
           nvdrmvideosink -e
      
  • CSI相机管道示例:

    $ gst-launch-1.0 nvarguscamerasrc ! \
         'video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, \
         format=(string)NV12, framerate=(fraction)30/1' ! \
         nvivafilter cuda-process=true \
         customer-lib-name="libnvsample_cudaprocess.so" ! \
         'video/x-raw(memory:NVMM), format=(string)NV12' ! nv3dsink -e
    

有关libnvsample_cudaprocess.so库源代码,请参见nvsample_cudaprocess_src.tbz2libnvsample_cudaprocess.so的示例CUDA实现可以替换为自定义CUDA实现。

使用GStreamer-1.0进行视频旋转

NVIDIA专有的nvvidconv GStreamer-1.0插件还允许您执行视频旋转操作。

下表显示了支持的nvvidconv flip-method属性值。

翻转法

flip-method属性值

身份(无轮换。默认)

0

逆时针90度

1

旋转180度

2

顺时针90度

3

水平翻转

4

右上对角翻转

5

垂直翻转

6

左上角对角线翻转

7

要获取有关nvvidconv翻转方法属性的信息,请输入以下命令:

$ gst-inspect-1.0 nvvidconv
  • 逆时针旋转视频90度:

    • 使用gst-v4l2解码器并在JetsonLinux上执行基于VIC的旋转:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux name=demux ! h264parse ! nvv4l2decoder ! \
           nvvidconv flip-method=1 ! \
           'video/x-raw(memory:NVMM), format=(string)I420' ! \
           nvdrmvideosink -e
      
    • 使用gst-v4l2解码器并在集成GPU上执行基于CUDA的旋转:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux ! h264parse ! nvv4l2decoder ! \
           nvvidconv compute-hw=GPU nvbuf-memory-type=nvbuf-mem-cuda-device \
           flip-method=1 ! 'video/x-raw(memory:NVMM), format=(string)I420' ! \
           nv3dsink -e
      
    • 使用gst-v4l2解码器并在专用GPU上执行基于CUDA的旋转:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux ! h264parse ! nvv4l2decoder cudadec-memtype=1 ! \
           nvvidconv compute-hw=GPU nvbuf-memory-type=nvbuf-mem-cuda-device \
           flip-method=1 ! 'video/x-raw(memory:NVMM)' ! \
           nveglglessink -e
      
  • 要将视频顺时针旋转90度:

    • 使用gst-v4l2解码器并在JetsonLinux上执行基于VIC的旋转:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux ! h264parse ! nvv4l2decoder ! \
           nvvidconv flip-method=3 ! \
           'video/x-raw(memory:NVMM), format=(string)I420' ! \
           nvdrmvideosink -e
      
    • 使用gst-v4l2解码器并在集成GPU上执行基于CUDA的旋转:

      $ gst-launch-1.0 filesrc location=<filename.mp4> ! \
           qtdemux ! h264parse ! nvv4l2decoder ! \
           nvvidconv flip-method=3 compute-hw=GPU \
           nvbuf-memory-type=nvbuf-mem-cuda-device ! \
           'video/x-raw(memory:NVMM), format=(string)I420' ! \
           nv3dsink -e
      
  • 旋转180度:

    • 使用nvarguscamerasrc并在JetsonLinux上执行基于VIC的旋转:

      $ gst-launch-1.0 nvarguscamerasrc ! \
           'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
           format=(string)NV12, framerate=(fraction)30/1' ! \
           nvvidconv flip-method=2 ! \
           'video/x-raw(memory:NVMM), format=(string)I420' ! nv3dsink -e
      
    • 使用nvarguscamerasrc并在集成GPU上执行基于CUDA的旋转:

      $ gst-launch-1.0 nvarguscamerasrc ! \
           'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
           format=(string)NV12, framerate=(fraction)30/1' ! \
           nvvidconv flip-method=2 compute-hw=GPU \
           nvbuf-memory-type=nvbuf-mem-cuda-device ! \
           'video/x-raw(memory:NVMM), format=(string)I420' ! nv3dsink -e
      
  • 要逆时针缩放和旋转视频90度:

    • 使用gst-v4l2解码器并在JetsonLinux上执行基于VIC的旋转:

      $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! qtdemux ! \
           h264parse ! nvv4l2decoder ! nvvidconv flip-method=1 ! \
           'video/x-raw(memory:NVMM), width=(int)480, height=(int)640, \
           format=(string)I420' ! nvdrmvideosink -e
      
    • 使用gst-v4l2解码器并在集成GPU上执行基于CUDA的旋转:

      $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! qtdemux ! \
           h264parse ! nvv4l2decoder ! nvvidconv flip-method=1 \
           compute-hw=GPU nvbuf-memory-type=nvbuf-mem-cuda-device ! \
           'video/x-raw(memory:NVMM), width=(int)480, height=(int)640, \
           format=(string)I420' ! nv3dsink -e
      
  • 要按顺时针方向缩放和旋转视频90度:

    • 使用nvarguscamerasrc并在JetsonLinux上执行基于VIC的旋转:

      $ gst-launch-1.0 nvarguscamerasrc ! \
           'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
           format=(string)NV12, framerate=(fraction)30/1' ! \
           nvvidconv flip-method=3 ! 'video/x-raw(memory:NVMM), \
           width=(int)480, height=(int)640, format=(string)I420' ! \
           nv3dsink -e
      
    • 使用nvarguscamerasrc并在集成GPU上执行基于CUDA的旋转:

      $ gst-launch-1.0 nvarguscamerasrc ! \
           'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
           format=(string)NV12, framerate=(fraction)30/1' ! \
           nvvidconv flip-method=3 compute-hw=GPU \
           nvbuf-memory-type=nvbuf-mem-cuda-device ! 'video/x-raw(memory:NVMM), \
           width=(int)480, height=(int)640, format=(string)I420' ! \
           nv3dsink -e
      
  • 要缩放和旋转视频180度:

    • 使用gst-v4l2解码器并在JetsonLinux上执行基于VIC的旋转:

      $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! \
           qtdemux ! h264parse ! nvv4l2decoder ! nvvidconv flip-method=2 ! \
           'video/x-raw(memory:NVMM), width=(int)640, height=(int)480, \
           format=(string)I420' ! nvdrmvideosink -e
      
    • 使用gst-v4l2解码器并在集成GPU上执行基于CUDA的旋转:

      $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! \
           qtdemux ! h264parse ! nvv4l2decoder ! nvvidconv flip-method=2 \
           compute-hw=GPU nvbuf-memory-type=nvbuf-mem-cuda-device ! \
           'video/x-raw(memory:NVMM), width=(int)640, height=(int)480, \
           format=(string)I420' ! nv3dsink -e
      

使用GStreamer-1.0进行视频合成

使用NVIDIA专有的nvcomitor GStreamer-1.0插件,您可以对相机和gst-v4l2视频解码流执行视频合成操作。

以不同格式合成解码流

  • 使用gst-v4l2解码器:

    $ gst-launch-1.0 nvcompositor \
         name=comp sink_0::xpos=0 sink_0::ypos=0 sink_0::width=1920 \
         sink_0::height=1080 sink_1::xpos=0 sink_1::ypos=0 \
         sink_1::width=1600 sink_1::height=1024 sink_2::xpos=0 \
         sink_2::ypos=0 sink_2::width=1366 sink_2::height=768 \
         sink_3::xpos=0 sink_3::ypos=0 sink_3::width=1024 \
         sink_3::height=576 ! 'video/x-raw(memory:NVMM)' ! nv3dsink \
         filesrc location=<filename_h264_1080p_30fps.mp4> ! qtdemux ! \
         h264parse ! nvv4l2decoder ! comp. filesrc \
         location=<filename_h265_1080p_30fps.mp4> ! qtdemux ! h265parse ! \
         nvv4l2decoder ! comp. filesrc \
         location=<filename_av1_1080p_30fps.webm> ! matroskademux ! \
         nvv4l2decoder ! comp. filesrc \
         location=<filename_vp9_1080p_30fps.webm> ! \
         matroskademux  ! nvv4l2decoder ! comp. -e
    

合成不同的相机源

  • 使用nvarguscamerasrc

    $ gst-launch-1.0 nvcompositor \
         name=comp sink_0::xpos=960 sink_0::ypos=540 sink_0::width=960 \
         sink_0::height=540 sink_1::width=1920 sink_1::height=1080 ! \
         'video/x-raw(memory:NVMM)' ! queue ! nv3dsink \
         nvarguscamerasrc sensor-id=0 ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=30/1' ! comp. \
         nvarguscamerasrc sensor-id=1 ! \
         'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, \
         format=(string)NV12, framerate=30/1' ! comp. -e
    

视频缩放的插值方法

NVIDIA专有的nvvidconvGStreamer-1.0插件允许您 选择用于缩放的插值方法。

下表显示了Jetson上基于VIC的nvvidconv interpolation-method属性支持的值。

插值法

interpolation-method物业价值

最近的(默认)

0

双线性

1

5-tap

2

10-tap

3

Smart

4

Nicest

5

下表显示了GPU上基于CUDA的nvvidconv interpolation-method属性支持的值。

插值法

interpolation-method物业价值

最近的(默认)

0

双线性

1

立方的

2

超级

3

Lanczos

4

要显示有关nvvidconvinterpolation-method属性的信息,请输入以下命令:

$ gst-inspect-1.0 nvvidconv

使用双线性插值方法进行缩放

  • 使用gst-v4l2管道并在JetsonLinux上执行基于VIC的扩展:

    $ gst-launch-1.0 filesrc location=<filename_1080p.mp4>! \
         qtdemux name=demux ! h264parse ! nvv4l2decoder ! \
         nvvidconv interpolation-method=1 ! \
         'video/x-raw(memory:NVMM), format=(string)I420, width=1280, \
         height=720' ! nvdrmvideosink -e
    
  • 使用gst-v4l2管道并在集成GPU上执行基于CUDA的扩展:

    $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! \
         qtdemux name=demux ! h264parse ! nvv4l2decoder ! \
         nvvidconv interpolation-method=1 compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! \
         'video/x-raw(memory:NVMM), format=(string)I420, width=1280, \
         height=720' ! nv3dsink -e
    
  • 使用gst-v4l2管道并在专用GPU上执行基于CUDA的扩展:

    $ gst-launch-1.0 filesrc location=<filename_1080p.mp4> ! \
         qtdemux ! h264parse ! nvv4l2decoder cudadec-memtype=1 ! \
         nvvidconv interpolation-method=1 compute-hw=GPU \
         nvbuf-memory-type=nvbuf-mem-cuda-device ! \
         'video/x-raw(memory:NVMM), format=(string)NV12, width=1280, \
         height=720' ! nveglglessink -e
    

EGLStream生产者示例

NVIDIA专有的nveglstreamsrcnvvideosinkGStreamer-1.0 插件允许模拟EGLStream生产者管道(仅用于预览。)

要模拟EGLStream生产者管道,请输入以下命令:

$ nvgstcapture-1.0 --camsrc=3

EGL图像变换示例

NVIDIA专有的nvegltransformGStreamer-1.0插件允许模拟EGLImage变换管道。

要模拟EGL图像转换管道:

  • 使用gst-v4l2管道:

    $ gst-launch-1.0 filesrc location=<filename_h264_1080p.mp4> ! \
         qtdemux ! h264parse ! nvv4l2decoder ! nvegltransform ! nveglglessink -e
    

GStreamer构建说明

使用gst-install脚本安装特定的GStreamer版本。本节提供了构建当前版本GStreamer的过程。

使用gst-install构建GStreamer

  1. 运行命令:

    $ gst-install [--prefix=<install_path>] [--version=<version>]
    

    在哪里:

    • <install_path>是要安装GStreamer的位置。

    • <version>是要安装的GStreamer版本。

  2. 运行命令:

    $ export LD_LIBRARY_PATH=<install_path>/lib/aarch64-linux-gnu
    $ export PATH=<install_path>/bin:$PATH
    

    其中<install_path>是GStreamer已安装的位置。

例如:

$ gst-install --prefix=/home/ubuntu/gst-1.16.2 --version=1.16.2
$ export LD_LIBRARY_PATH=/home/ubuntu/gst-1.16.2/lib/aarch64-linux-gnu
% export PATH=/home/ubuntu/gst-1.16.2/bin:$PATH

手动构建GStreamer

  1. 下载最新版本的GStreamer,可从 freedesktop.orgGStreamer源目录

    您需要版本1.16.2中的以下文件:

    • gstreamer-1.16.2.tar.xz

    • gst-plugins-base-1.16.2.tar.xz

    • gst-plugins-good-1.16.2.tar.xz

    • gst-plugins-bad-1.16.2.tar.xz

    • gst-plugins-ugly-1.16.2.tar.xz

  2. 要安装所需的包,请输入命令:

    $ sudo apt-get install build-essential dpkg-dev flex bison \
          autotools-dev automake liborc-dev autopoint libtool \
          gtk-doc-tools libgstreamer1.0-dev
    
  3. 在home(~)目录中,创建一个名为gst_<version>的子目录,其中<version>是您正在构建的GStreamer的版本号。

  4. 将下载的.tar.xz文件复制到gst_<version>目录。

  5. 解压缩gst_<version>目录中的.tar.xz文件。

  6. 通过输入以下命令设置环境变量PKG_CONFIG_PATH.

    $ export PKG_CONFIG_PATH=/home/ubuntu/gst_1.16.2/out/lib/pkgconfig
    
  7. 通过输入以下命令构建GStreamer(在本例中为gstreamer-1.16.2):

    $ ./configure --prefix=/home/ubuntu/gst_1.16.2/out
    $ make
    $ make install
    
  8. 构建gst-plugins-base-1.16.2通过输入以下命令:

    $ sudo apt-get install libxv-dev libasound2-dev libtheora-dev \
          libogg-dev libvorbis-dev
    $ ./configure --prefix=/home/ubuntu/gst_1.16.2/out
    $ make
    $ make install
    
  9. 构建gst-plugins-good-1.16.2通过输入以下命令:

    $ sudo apt-get install libbz2-dev libv4l-dev libvpx-dev \
          libjack-jackd2-dev libsoup2.4-dev libpulse-dev
    $ ./configure --prefix=/home/ubuntu/gst_1.16.2/out
    $ make
    $ make install
    
  10. 获取和构建gst-plugins-bad-1.16.2通过输入以下命令:

    $ sudo apt-get install faad libfaad-dev libfaac-dev
    $ ./configure --prefix=/home/ubuntu/gst_1.16.2/out
    $ make
    $ make install
    
  11. 获取和构建gst-plugins-ugly-1.16.2通过输入以下命令:

    $ sudo apt-get install libx264-dev libmad0-dev
    $ ./configure --prefix=/home/ubuntu/gst_1.16.2/out
    $ make
    $ make install
    
  12. 通过输入以下命令设置环境变量LD_LIBRARY_PATH

    $ export LD_LIBRARY_PATH=/home/ubuntu/gst_1.16.2/out/lib/
    
  13. 通过输入以下命令将NVIDIAgstreamer-1.0库复制到gst_1.16.2插件目录:

    $ cd /usr/lib/aarch64-linux-gnu/gstreamer-1.0/
    $ cp libgstnv\* ~/gst_1.16.2/out/lib/gstreamer-1.0/
    

    NVIDIAgstreamer-1.0库包括:

    • libgstnvarguscamera.so

    • libgstnvv4l2camerasrc.so

    • libgstnvcompositor.so

    • libgstnvdrmvideosink.so

    • libgstnveglglessink.so

    • libgstnveglstreamsrc.so

    • libgstnvegltransform.so

    • libgstnvivafilter.so

    • libgstnvjpeg.so

    • libgstnvtee.so

    • libgstnvvidconv.so

    • libgstnvvideo4linux2.so

    • libgstnvvideocuda.so

    • libgstnvvideosink.so

    • libgstnvvideosinks.so

nvgstcatch-1.0参考

本节介绍nvgstcapp-1.0应用程序。

默认情况下,nvgstcapture-1.0仅支持使用nvarguscamasrc插件的ARGUS API。不再支持旧版nvcamerasrc插件。

命令行选项

要显示命令使用信息,请使用以下命令行选项之一运行nvgstcapture-1.0

  • -h--help:显示命令行选项(GStreamer选项除外)。

  • --help-all:显示所有命令行选项。

  • --help-get:显示GStreamer命令行选项。

下表描述了应用程序的其他命令行选项:

nvgstcapture-1.0命令行选项
选项描述值和示例
--prev_res预览宽度和高度。范围:2至8(3840×2160)

--prev_res=3

--cu-prev-res预览自定义宽度和高度(仅限CSI)。--cus-prev-res=1920x1080
--image_res图像宽度和高度。范围:2到12(5632x4224)

--image_res=3

--video-res视频宽度和高度。范围:2到9(3896x2192)

--video-res=3

--camsrc要使用的相机源。0: V4L2
1: csi(默认)
2:视频测试
3:eglstream
-m
--mode
捕获模式。1:静止
2:视频
-v
--video_inc
视频编码器类型。0: h264[硬件][默认]
1: vp8[硬件][Jetson AGX Xavier系列不支持]
2: h265[HW]
3: vp9[HW][Jetson AGX Orin系列不支持]
4: h264[SW][Jetson Orin Nano的默认值]
-p
--hw-enc-path
框架类型。0: CMX
1:V4L2
-b
--enc-bitrate
视频编码比特率(以字节为单位)。--enc-bitrate=4000000
--enc-controlrate视频编码码率控制方法。0:禁用
1:变量(默认)
2:常数

--enc-controlrate=1

--enc-EnableTwopassCBR编码时启用两遍CBR。0:禁用
1:启用

--enc-EnableTwopassCBR=1

--enc-profile视频编码器配置文件(仅适用于H.264)。0:基线
1:主要
2:高
-j,--image_enc图像编码器类型。
[
-k,--file_type容器文件类型。0: MP4
1:3GP
2:MKV
--file-name捕获的文件名。默认使用“nvcamtest”。
--color-format要使用的颜色格式。0: I420
1: NV12[仅用于CSI,默认用于CSI]
2:YUY2[仅限V4L2,默认为V4L2]
--orientation相机传感器方位值。
--eglConfigEGL™窗口坐标(x, y)顺序。--eglConfig="50 100"
-w
--whitebalance
捕获白平衡值。
--timeout捕获超时值。
--saturation相机饱和度值。
--Sensor-id相机传感器ID值。
--display-id[仅适用于nvoverlaySink]显示ID值。
--overlayConfig按索引、x、y、宽度、高度)顺序覆盖配置选项索引和坐标。--overlayConfig="0, 0, 0, 1280, 720"
--cap-dev-node视频捕获设备节点。/dev/video0[default]
/dev/video1
/dev/video2

--cap-dev-node=0

--svs=<chain>

其中<chain>是GStreamer元素的链:

对于USB,指定视频预览链。

仅对于CSI,请使用nvoverlaysinknvdrmvideosink

--exposuretimerange调整曝光时间范围的属性,以纳秒为单位。--exposuretimerange="34000 358733000"
--gainrange调整增益范围的属性。--gainrange="1 16"
--ispdigitalgainrange调整数字增益范围的属性。范围值从1到256。

--ispdigitalgainrange="1 8"

--aelock启用AE锁。默认禁用。
--awblock启用AWB锁。默认禁用。
--exposurecompensation调整曝光补偿的属性。范围值从−2.0到2.0。

--exposurecompensation=0.5

--aeantibanding设置自动曝光反显带模式的属性。范围值从0到3。

--aeantibanding=2

--tnr-mode属性来选择时间降噪模式。--tnr-mode=2
--tnr-mode调整时间降噪强度的属性。--tnr-strength=0.5
--ee-mode选择边缘增强模式的属性。--ee-mode=2
--ee-mode调整边缘增强强度的属性。--ee-strength=0.5

CSI相机支持的分辨率

CSI相机支持Nvargus相机的以下图像分辨率:

  • 640×480

  • 1280×720

  • 1920×1080

  • 2104×1560

  • 2592×1944

  • 2616×1472

  • 3840×2160

  • 3896×2192

  • 4208×3120

  • 5632×3168

  • 5632×4224

CSI相机运行时命令

Nvargus相机的选项

下表描述了Nvarguscamera的CSI相机运行时命令行选项。

Nvarguscam命令行选项

命令

描述

价值和例子

h

帮帮忙。

q

辞职。

mo:<value>

设置捕获模式。

1:形象

2:视频

gmo

获取捕获模式。

so:<val>

设置传感器方向。

0:无

1:逆时针旋转90°

2:旋转180°

3:顺时针旋转90°

gso

获取传感器方向。

wb:<value>

设置白平衡模式。

0:关闭

1:自动

2:白炽灯

3:荧光

4:暖荧光

5:日光

6:阴天-日光

7:暮光之城

8:阴影

9:手动

gwb

获取白平衡模式。

st:<value>

设置饱和度。

0-2

示例:st:1.25

gst

达到饱和。

j

捕捉一张图像。

jx<sec>

延迟后捕获 <sec>秒。

示例:jx5000用于 5秒延迟。

j:<value>

捕获<count> 连续的图像。

示例:j:6捕捉 6个图像。

0

停止录制视频。

1

开始录制视频。

2

视频快照(录制视频时)。

gpcr

获取预览分辨率。

gicr

获取图像捕获分辨率。

gvcr

获取视频捕获分辨率。

USB相机运行时命令

下表描述了USB相机运行时命令。

USB相机运行时命令

命令

描述

价值和例子

h

帮帮忙。

q

辞职。

mo:<value>

设置捕获模式。

1:形象

2:视频

gmo

获取捕获模式。

j

捕捉一张图像。

jx<ms>

延迟后捕获 <ms>毫秒。

示例:jx5000到 捕获后 5000毫秒 (5第二)延迟。

j:<n>

捕获<n>图像 继承。

示例:j:6捕捉 6个图像。

1

开始录制视频。

0

停止录制视频。

pcr:<value>

设置预览分辨率。

0: 176×144

1: 320×240

2: 640×480

3: 1280×720

gpcr

获取预览分辨率。

gicr

获取图像捕获分辨率。

gvcr

获取视频捕获分辨率。

br:<value>

以字节为单位设置编码码率。

示例:br:4000000

gbr

获取编码码率。

cdn:<value>

设置捕获设备节点。

0://dev/video0

1://dev/video1

2://dev/video2

gcdn

获取捕获设备节点。

运行时视频编码器配置选项

下表描述了运行时视频编码器配置 支持的选项Nvarguscamera

运行时视频编码器选项

命令

描述

价值和例子

br:<val>

以字节为单位设置编码比特率。

示例:br:4000000

gbr

获取以字节为单位的编码比特率。

ep:<val>

设置编码配置文件(仅适用于H.264)。

0:基线

1:主要

2:高

示例:ep:1

gep

获取编码配置文件(仅适用于H.264)。

Enter 'f'

强制视频编码器上的IDR帧(仅适用于H.264)。

笔记

  • nvgstcapture-1.0在与应用程序本身相同的目录中生成图像和视频输出文件。

  • 文件名分别为以下格式:

    • 图片内容:nvcamtest_<pid>_<sensor_id>_<counter>.jpg

    • 视频内容:nvcamtest_<pid>_<sensor_id>_<counter>.mp4

    在哪里:

    • <pid>是进程ID。

    • <sensor_id>是传感器ID。

    • <counter>是每次运行应用程序时从0开始的计数器。

  • 在运行之间重命名或移动文件以避免覆盖要保存的结果。

  • 该应用程序默认支持本机捕获模式(仅限视频)。

  • USB相机不支持高级功能,例如设置变焦、亮度、曝光和白平衡级别。

nvgstplayer-1.0参考

本节介绍nvgstplayer-1.0应用程序的操作。

命令行选项

要列出支持的选项,请输入命令:

$ nvgstplayer-1.0 --help

此表描述了nvgstplayer-1.0命令行选项。

nvgstplayer-1.0命令行选项
选项说明和示例
-u <path>
--urifile <path>

包含URI的文件的路径。

示例: -u my_uri.txt

-i <uri>
--uri <uri>

URI输入。

例子:

-uri file:///home/ubuntu/movie.avi

-uri https://www.joedoe.com/foo.ogg

-e <path>
--elemfile <path>

元素(属性)文件。

元素文件可能包含音频或视频处理元素链。

例子:

[sas]

pipe=alsasink # device=demixer

-x

--cxpr

命令序列表达式。

示例: -cxpr="r5 s0"

-n<n>
--loop <n>

播放媒体的次数。

-c<n>
--audio-track <n>

如果流有多个音轨,请指定要播放的音轨号

-v<n>
--video-track <n>

如果流有多个视频轨道,请指定要播放的轨道号。

-a<sec>
--start<sec>

点开始播放,以秒为单位从媒体段开始。

-d<sec>
--duration <sec>

播放时长,以秒为单位。

--no-sync

禁用AV同步。

--disable-dpms

在操作期间无条件禁用DPMS/ScreenBlanking;退出时重新启用。

--stealth

在隐身模式下操作,即使没有媒体播放也能保持活力。

-bg

在后台模式下操作,忽略键盘输入。

--use-playbin

使用Playbin GStreamer元素。

--no-audio

禁用音频。

--no-video

禁用视频。

--disable-anative

禁用本机音频渲染。

--disable-vnative

禁用本机视频渲染。

--use-buffering

启用基于低和高百分比阈值的发射GST_MESSAGE_BUFFERING的解码带属性。

-l <pct>
--low-percent <pct>

启动缓冲的低阈值,以pct为单位。

-j <pct>
--high-percent <pct>

缓冲完成的高阈值,以百分比为单位。

--loop-forever

在无限循环中播放URI。

-t<sec>
--max-size-time<sec>

排队的最长时间,以秒为单位(0=自动)。

-y<n>
--max-size-bytes<n>

队列中的最大内存量,以字节为单位(0=自动)。

-b<n>
--max-size-buffers <n>

队列中的最大缓冲区数(0=自动)。

--window-x<n>

播放器窗口的X坐标(用于非覆盖渲染)。

--window-y <n>

播放器窗口的Y坐标(用于非覆盖渲染)。

--window-width <n>

窗口宽度(用于非覆盖渲染)。

--window-height <n>

窗口高度(用于非覆盖渲染)。

--disable-fullscreen

以非全屏模式播放视频(对于nveglglessink)。

-k<sec>
--image-display-time<sec>

图像显示时间,以秒为单位。

--show-tags

显示标签(元数据)(如果可用)。

--stats

显示流统计信息(如果启用)。

--stats-file

要转储流统计信息的文件(如果启用)。

--svd=<chain>

用于视频解码的链。

其中<chain>如下所述。
--sad=<chain>

用于音频解码的链。

--svc=<chain>

用于视频后处理的链。

--sac=<chain>

用于音频后处理的链。

--svs=<chain>

用于视频渲染的链。

--sas=<chain>

用于音频渲染的链。

--shttp=<chain>

用于HTTP源的链。

--srtsp=<chain>

用于RTSP源的链。

--sudp=<chain>

用于UDP源的链。

--sfsrc=<chain>

用于文件源的链。

<chain>是应用于指定函数的GStreamer元素链。它的值是一组由'!'分隔的一个或多个元素。每个元素都是一组由'#'分隔的一个或多个属性。

例子:

--svd="avdec_h264# skip-frame=1# output-corrupt=false"
--sad="aacparse ! faad# min-latency=4000000"
--svc="videoconvert# qos=0 ! videoscale"
--sac="audioconvert ! audioresample"
--svs="videoconvert ! videoscale ! ximagesink# sync=0"
--sas="audioconvert ! osssink# device=/dev/dsp1# latency-time=20000"

nvgstplayer-1.0运行时命令

此表描述了nvgstplayer运行时命令。

nvgstplayer-1.0运行时命令
选项说明和示例
h帮助。
q退出。
向上箭头
]
转到下一个轨道。
c重新启动当前轨道。
向下箭头
[
转到上一个轨道。
spos查询位置(从开始的时间)。
sdur查询持续时间。
s<sec>

从开始寻求<sec>秒。

示例:s5.120

v<pct>

寻求持续时间的<pct>百分比。

示例:v54

f<sec>

相对于当前位置移动<sec>秒。

示例:f23.901

左箭头
<
向后寻找10秒。
右箭头
>
向前看10秒钟。
p暂停播放。
r开始/恢复播放。
z停止播放。
i:<uri>输入单个URI。

视频编码器功能

相应的基于GStreamer-1.0的gst-v4l2视频编码器支持以下功能:

gst-v4l2视频编码器功能
功能H264encH265encVp8encVp9enc
配置文件(基线/主/高)✓(全部)✓(主)
控制速率
bitrate
插入-spspsatidr---
配置文件---
quantization range for I, P, and B frame--
iframe间隔
qp-range--
位-分组--
预设级别
切片-标题行间距--
force-IDR
启用TwoPassCBR--
启用CABAC-entropy-coding---
启用MVBufferMeta--
插入aud--
插入vui--
num-B-Frames---
图片顺序计数类型---

支持的相机

本节介绍支持的摄像机。

CSI摄像机

  • 捷信AGX Xavier系列可以通过CSI接口捕捉相机图像。

  • Jetson AGX Xavier系列支持YUV和RAW Bayer捕获数据。

  • GStreamer支持从多个CSI摄像机同时捕获。使用nvgstcapture应用程序验证支持。

  • 捕获验证SDR,PWL HDR和DOL HDR模式的各种传感器使用nvgstcapture应用程序。

  • Jetson AGX Xavier系列还支持MIPI CSI虚拟通道功能。虚拟通道是一个唯一的通道标识符,用于通过支持的GMSL(千兆多媒体串行链路)聚合器共享相同CSI端口/砖和CSI流的多路复用传感器流。

  • GMSL+VC捕获在Jetson AGX Xavier系列上使用nvgstcapture应用程序进行验证。参考GMSL模块(MAX9295-seralizer/MAX9296-deserializer/IMX390-传感器)用于验证目的。

USB 2.0相机

以下相机已在运行带有USB 2.0端口的JetsonLinux的Jetson平台上进行了验证。此相机符合UVC标准。

工业相机详细信息

以下USB 3.0工业相机在JetsonLinux下的Jetson AGX Xavier系列上得到验证:

这款相机的特点是:

  • USB 3.0

  • UVC兼容

  • 3840×2160,30 FPS;4224×3156,13 FPS

  • 目的-嵌入式导航

  • 使用nvgstcatch应用程序进行测试。

  • 遇到的问题:

    FPS无法修复。根据曝光进行更改。

    FPS无法更改。需要向供应商付款才能将支持添加到他们的固件中。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值