赞
踩
原文: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。
输入命令:
$ 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
注
该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-launch
或nvgstplayer
:
$ export DISPLAY=:0
如果X服务器尚未运行,请输入此命令以启动它:
$ xinit &
本节中的示例展示了如何使用GStreamer执行音频和视频解码。
以下示例展示了如何使用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
以下示例展示了如何使用 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
以下示例显示了如何在GStreamer-1.0上执行JPEG解码。
JPEG解码(NVIDIA加速解码):
$ gst-launch-1.0 filesrc location=<filename.jpg> ! nvjpegdec ! \
imagefreeze ! xvimagesink -e
本节中的示例展示了如何使用GStreamer执行音频和视频编码。
以下示例展示了如何在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
以下示例展示了如何使用GStreamer-1.0执行视频编码。
以下示例显示了如何使用 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
以下示例显示了如何在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
本节介绍NVIDIA加速H.264/H.265/VP9/AV1编码器支持的功能的示例gst-Launing-1.0用法。
本节介绍了NVIDIA 加速 H.264/H.265/VP8/VP9 gst-v4l2
支持的功能的示例 gst-Launing-1.0 用法。
注
使用以下命令显示有关nvv4l2h264enc
、nvv4l2h265enc
、v4l2vp9enc
或nvv4l2vp8enc
的详细信息:
$ gst-inspect-1.0 [nvv4l2h264enc | nvv4l2h265enc | nvv4l2vp9enc | nvv4l2av1enc]
设置 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
要显示nvgstcapture-1.0
使用信息,请输入以下命令:
$ nvgstcapture-1.0 --help
注
默认nvgstcapture-1.0
应用程序仅支持使用nvarguscamerasrc
插件的ARGUS API。不推荐使用旧的nvcamerasrc
插件支持。
有关详细信息,请参阅nvgstcappt-1.0参考。
使用以下命令通过使用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
$ 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。
要使用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(I420格式)并使用xvimagesink预览显示:
$ gst-launch-1.0 v4l2src device="/dev/video0" ! \
"video/x-raw, width=640, height=480, format=(string)YUY2" ! \
xvimagesink -e
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
要显示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
您可以使用基于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进行视频流传输的过程。
使用nvgstplayer-1.0:输入命令:
$ nvgstplayer-1.0 -i rtsp://10.25.20.77:554/RTSP_contents/VIDEO/H264/
test_file_h264.3gp –stats
支持的视频流格式有:
MPEG4 | MPEG4+AAC | MPEG4+AAC PLUS | MPEG4+eAAC PLUS | MPEG4+AMR-NB | MPEG4+AMR-WB |
H263 | H263+AAC | H263+AAC PLUS | H263+AMR-NB | H263+AMR-WB | |
H264 | H264+AAC | H264+AAC PLUS | H264+eAAC PLUS | H264+AMR-NB | H264+AMR-WB |
AAC | AAC PLUS | eAAC PLUS | AMR-NB | AMR-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
NVIDIA专有的nvvidconv
GStreamer-1.0插件允许在OSS(原始)视频格式和NVIDIA视频格式之间进行转换。nvvidconv
插件目前支持本节中描述的格式转换。
目前基于VIC的nvvidconv
on Jetson支持I420
、UYVY
、YUY2
、YVYU
、NV12
、NV16
、NV24
、P010_10LE
、GRAY8
、BGRx
、RGBA
和Y42B RAW-YUV
输入格式和基于CUDA的nvvidconv
on GPU支持I420
、NV12
、P010_10LE
、GRAY8
、BGRx
和RGBA
输入格式。
输入以下命令以在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密集型的。
目前基于VIC的nvvidconv
支持I420
、UYVY
、YUY2
、YVYU
、NV12
、NV16
、NV24
、GRAY8
、BGRx
、RGBA
和Y42B RAW-YUV
输出格式,基于GPU的CUDAnvvidconv
支持I420
、NV12
、P010_10LE
、I420_10LE
、GRAY8
、BGRx
和RGBA
输出格式。
输入以下命令以在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密集型的。
目前基于GPU的CUDAnvvidconv
支持I420
、NV12
、P010_10LE
、GRAY8
、BGRx
和RGBA
输入格式,并支持I420
、NV12
、P010_10LE
、I420_10LE
、GRAY8
、BGRx
和RGBA
输出格式和基于VIC的nvvidconv
支持下表中描述的NVIDIA输入和输出格式的组合。左侧列中的任何格式都可以转换为右侧列中同一行中的任何格式。
NV12 NV24 | NV16 | NV12 NV24 | NV16 |
I420 I420_12LE | I420_10LE P010_10LE | I420 | I420_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
NVIDIA专有的nvvidconv
GStreamer-1.0插件还允许您 执行视频缩放。nvvidconv
插件当前支持缩放 使用本节中描述的格式转换。
原始YUV输入格式:
目前基于VIC的nvvidconv
on Jetson支持I420、UYVY、YUY2、YVYU、NV12、NV16、NV24、P010_10LE、GRAY8、BGRx、RGBA和Y42BRAW-YUV输入格式用于缩放,基于CUDA的nvvidconv
GPU支持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密集型的。
NVIDIA专有的nvvidconv
GStreamer-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
您可以在以下视频格式之间执行视频转码。
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
本节介绍用于NVIDIA®CUDA®后处理操作的GStreamer-1.0插件。
这个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.tbz2
。libnvsample_cudaprocess.so
的示例CUDA实现可以替换为自定义CUDA实现。
NVIDIA专有的nvvidconv GStreamer-1.0插件还允许您执行视频旋转操作。
下表显示了支持的nvvidconv
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
使用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专有的nvvidconv
GStreamer-1.0插件允许您 选择用于缩放的插值方法。
下表显示了Jetson上基于VIC的nvvidconv
interpolation-method
属性支持的值。
插值法 |
|
---|---|
最近的(默认) | 0 |
双线性 | 1 |
5-tap | 2 |
10-tap | 3 |
Smart | 4 |
Nicest | 5 |
下表显示了GPU上基于CUDA的nvvidconv
interpolation-method
属性支持的值。
插值法 |
|
---|---|
最近的(默认) | 0 |
双线性 | 1 |
立方的 | 2 |
超级 | 3 |
Lanczos | 4 |
注
要显示有关nvvidconv
interpolation-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
NVIDIA专有的nveglstreamsrc
和nvvideosink
GStreamer-1.0 插件允许模拟EGLStream生产者管道(仅用于预览。)
要模拟EGLStream生产者管道,请输入以下命令:
$ nvgstcapture-1.0 --camsrc=3
NVIDIA专有的nvegltransform
GStreamer-1.0插件允许模拟EGLImage变换管道。
要模拟EGL图像转换管道:
使用gst-v4l2
管道:
$ gst-launch-1.0 filesrc location=<filename_h264_1080p.mp4> ! \
qtdemux ! h264parse ! nvv4l2decoder ! nvegltransform ! nveglglessink -e
使用gst-install
脚本安装特定的GStreamer版本。本节提供了构建当前版本GStreamer的过程。
运行命令:
$ gst-install [--prefix=<install_path>] [--version=<version>]
在哪里:
<install_path>
是要安装GStreamer的位置。
<version>
是要安装的GStreamer版本。
运行命令:
$ 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,可从 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
要安装所需的包,请输入命令:
$ sudo apt-get install build-essential dpkg-dev flex bison \
autotools-dev automake liborc-dev autopoint libtool \
gtk-doc-tools libgstreamer1.0-dev
在home(~
)目录中,创建一个名为gst_<version>
的子目录,其中<version>
是您正在构建的GStreamer的版本号。
将下载的.tar.xz
文件复制到gst_<version>
目录。
解压缩gst_<version>
目录中的.tar.xz
文件。
通过输入以下命令设置环境变量PKG_CONFIG_PATH
.
$ export PKG_CONFIG_PATH=/home/ubuntu/gst_1.16.2/out/lib/pkgconfig
通过输入以下命令构建GStreamer(在本例中为gstreamer-1.16.2
):
$ ./configure --prefix=/home/ubuntu/gst_1.16.2/out
$ make
$ make install
构建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
构建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
获取和构建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
获取和构建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
通过输入以下命令设置环境变量LD_LIBRARY_PATH
:
$ export LD_LIBRARY_PATH=/home/ubuntu/gst_1.16.2/out/lib/
通过输入以下命令将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
本节介绍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)
| |
--cu-prev-res | 预览自定义宽度和高度(仅限CSI)。 | --cus-prev-res=1920x1080 | |
--image_res | 图像宽度和高度。 | 范围:2到12(5632x4224)
| |
--video-res | 视频宽度和高度。 | 范围:2到9(3896x2192)
| |
--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-EnableTwopassCBR | 编码时启用两遍CBR。 | 0:禁用 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 | 相机传感器方位值。 | ||
--eglConfig | EGL™窗口坐标(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
| |
--svs=<chain> | 其中 对于USB,指定视频预览链。 仅对于CSI,请使用 | ||
--exposuretimerange | 调整曝光时间范围的属性,以纳秒为单位。 | --exposuretimerange="34000 358733000" | |
--gainrange | 调整增益范围的属性。 | --gainrange="1 16" | |
--ispdigitalgainrange | 调整数字增益范围的属性。 | 范围值从1到256。
| |
--aelock | 启用AE锁。 | 默认禁用。 | |
--awblock | 启用AWB锁。 | 默认禁用。 | |
--exposurecompensation | 调整曝光补偿的属性。 | 范围值从−2.0到2.0。
| |
--aeantibanding | 设置自动曝光反显带模式的属性。 | 范围值从0到3。
| |
--tnr-mode | 属性来选择时间降噪模式。 | --tnr-mode=2 | |
--tnr-mode | 调整时间降噪强度的属性。 | --tnr-strength=0.5 | |
--ee-mode | 选择边缘增强模式的属性。 | --ee-mode=2 | |
--ee-mode | 调整边缘增强强度的属性。 | --ee-strength=0.5 |
CSI相机支持Nvargus相机的以下图像分辨率:
640×480
1280×720
1920×1080
2104×1560
2592×1944
2616×1472
3840×2160
3896×2192
4208×3120
5632×3168
5632×4224
下表描述了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 示例: |
gst | 达到饱和。 | — |
j | 捕捉一张图像。 | — |
jx<sec> | 延迟后捕获 | — 示例: |
j:<value> | 捕获 | — 示例: |
0 | 停止录制视频。 | — |
1 | 开始录制视频。 | — |
2 | 视频快照(录制视频时)。 | — |
gpcr | 获取预览分辨率。 | — |
gicr | 获取图像捕获分辨率。 | — |
gvcr | 获取视频捕获分辨率。 | — |
下表描述了USB相机运行时命令。
USB相机运行时命令 | ||
---|---|---|
命令 | 描述 | 价值和例子 |
h | 帮帮忙。 | — |
q | 辞职。 | — |
mo:<value> | 设置捕获模式。 | 1:形象 2:视频 |
gmo | 获取捕获模式。 | — |
j | 捕捉一张图像。 | — |
jx<ms> | 延迟后捕获 | — 示例: |
j:<n> | 捕获 | — 示例: |
1 | 开始录制视频。 | — |
0 | 停止录制视频。 | — |
pcr:<value> | 设置预览分辨率。 | 0: 176×144 1: 320×240 2: 640×480 3: 1280×720 |
gpcr | 获取预览分辨率。 | — |
gicr | 获取图像捕获分辨率。 | — |
gvcr | 获取视频捕获分辨率。 | — |
br:<value> | 以字节为单位设置编码码率。 | 示例: |
gbr | 获取编码码率。 | — |
cdn:<value> | 设置捕获设备节点。 | 0: 1: 2: |
gcdn | 获取捕获设备节点。 | — |
本节介绍nvgstplayer-1.0
应用程序的操作。
注
要列出支持的选项,请输入命令:
$ nvgstplayer-1.0 --help
此表描述了nvgstplayer-1.0
命令行选项。
nvgstplayer-1.0 命令行选项 | ||
---|---|---|
选项 | 说明和示例 | |
-u <path> --urifile <path> | 包含URI的文件的路径。 示例: | |
-i <uri> --uri <uri> | URI输入。 例子:
| |
-e <path> --elemfile <path> | 元素(属性)文件。 元素文件可能包含音频或视频处理元素链。 例子:
| |
-x --cxpr | 命令序列表达式。 示例: | |
-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 | 启用基于低和高百分比阈值的发射 | |
-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> | 用于文件源的链。 | |
例子:
|
相应的基于GStreamer-1.0的gst-v4l2
视频编码器支持以下功能:
gst-v4l2 视频编码器功能 | ||||
---|---|---|---|---|
功能 | H264enc | H265enc | Vp8enc | Vp9enc |
配置文件(基线/主/高) | ✓(全部) | ✓(主) | ✓ | ✓ |
控制速率 | ✓ | ✓ | ✓ | ✓ |
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 | ✓ | - | - | - |
图片顺序计数类型 | ✓ | - | - | - |
本节介绍支持的摄像机。
捷信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-传感器)用于验证目的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。