IMX8 GSTREAM指令方式控制介绍

IMX8 GSTREAM

虽然说我自己也可以不用英文看明白这个pdf,但是一方面说为了一种积累,另一方面说万一有人需要或许可以帮助到需要在IMX8板子上使用gstreamer命令行进行音视频调试的人

章节1 介绍

本文档是所有包含在NXP BSP L5.4.24_2.1.1支持的i.MX8系列soc中,基于GStreamer 1.0版本的解决方案的用户指南。

其中的指令是以imx8上运行的发行版linux系统如Ubuntu 18.04 LTD测试的,主机上系统不要求一定是ubuntu,只是其他版本并未进行测试。

此文档的说明适用于以下版本:

  • i.MX 8M Quad EVK

  • i.MX 8M Mini EVK

  • i.MX 8M Nano EVK

  • i.MX 8QuadXPlus MEK B0

  • i.MX 8QuadMax MEK B0

------------------------------------------------------版本历史----------------------------------------------------------不重要

章节2 GStreamer-1.0插件参考

NXP BSP L5.4.24_2.1.1支持大量的GStreamer插件。本节描述了使用的所有插件这个用户指南,但它并不打算让用户受到他们的限制,所以感觉自由和鼓励体验其他选项。
要检查所有可用的插件,请在设备上输入以下命令:

gst-inspect-1.0

2.1 视频解码插件

视频解码器通常用于将视频源格式(其他编码格式)链接到原始格式,该格式可以由目标接收器(如显示器)解析

插件名称Package 插件包Description 解释
decodebingst-plugins-base
(gstreamer应用所需的必要插件)
Autoplug and decode to raw media
自动并解码到原始格式
v4l2mpeg4decgst-plugins-good
(高质量的采用LGPL授权的插件)
Decodes MPEG4 streams via V4L2 API
经由V4L2插件解码MPEG4视频流
v4l2mpeg2decgst-plugins-goodDecodes MPEG2 streams via V4L2 API
经由V4L2插件解码MPEG2视频流
v4l2h264decgst-plugins-goodDecodes H.264 streams via V4L2 API
经由V4L2插件解码H.264视频流
v4l2h265decgst-plugins-goodDecodes H.265 streams via V4L2 API
经由V4L2插件解码H.265视频流
v4l2vp6decgst-plugins-goodDecodes VP6 streams via V4L2 API
经由V4L2插件解码VP6视频流
v4l2vp8decgst-plugins-goodDecodes VP8 streams via V4L2 API
经由V4L2插件解码VP8视频流

2.2 视频编码插件

作为解码器的对立面,视频编码器可以将原始数据转换为编码后的视频例如H.264格式。

插件名称Package 插件包Description 解释
encodebingst-plugins-base
(gstreamer应用所需的必要插件)
Convenience encoding/muxing element
方便的编码/复用元素
v4l2h264encgst-plugins-good
(高质量的采用LGPL授权的插件)
Encode H.264 video streams via V4L2 API
经由V4L2插件编码成H.264视频流

2.3 视频接收器(或者叫视频槽)插件

视频槽插件用于通过显示器展示输出数据分析结果(说人话就是选择通过什么方式处理解码后的数据并显示到目标显示器上)

插件名称Package 插件包Description 解释
autovideosinkgst-plugins-good
(高质量的采用LGPL授权的插件)
Wrapper video sink for automatically detected video sink
封装好的抱恨自动检测的视频槽
kmssinkgst-plugins-bad
(质量有待提高的插件,成熟后可以移到good插件列表中)
Video sink using the Linux Kernel mode setting API*
使用Linux内核模式设置API的视频槽
ximagesinkgst-plugins-base
(gstreamer应用所需的必要插件)
A standard X based videosink**
标准的基于X的视频槽
glimagesinkgst-plugins-baseInfrastructure to process GL textures
处理openGL的视频槽
waylandsinkgst-plugins-badOutput to wayland surface
输出到wayland界面
fbdevsinkgst-plugins-badOutput a Linux framebuffer videosink
输出到linux帧缓存的视频槽
fpsdisplaysinkgst-plugins-badVideo sink with current and average framerate
具有当前平均帧率的视频槽

*为了使用kmssink和fbdevsink插件,请执行以下命令之前停止weston接口 $ systemctl stop weston

**为了使用ximagesink插件,请在:$ export DISPLAY=:0之前启动X服务器

2.4 解复用插件

Demux插件负责将不同的视频/音频格式转换为原始的未解析数据,即将信号束分散。最常见的有如下表所示。

插件名称Package 插件包Description 解释
qtdemuxgst-plugins-good
(高质量的采用LGPL授权的插件)
Demux a .mov/.mp4 file to raw data
将.mov/.mp4文件转换为原始数据
matroskademuxgst-plugins-goodDemux a .mkv file to raw data
将.mkv文件转换为原始数据
flvdemuxgst-plugins-goodDemux a .flv file to raw data
将.flv文件转换为原始数据
avidemuxgst-plugins-goodDemux a .avi file to raw data
将.avi文件转换为原始数据
aiurdemuximx-gst1.0-pluginUnified parser for raw data
统一解析原始数据

2.5 复用插件 Mux Plugins

Mux 插件负责将原始未解析数据转换为特定的视频/音频数据。最常见的在下表中有描述

插件名称Package 插件包Description 解释
qtmuxgst-plugins-good
(高质量的采用LGPL授权的插件)
Mux a raw data to a .mov file
将原始数据转换为.mov文件
matroskamuxgst-plugins-goodMux a raw data to a .mkv file
将原始数据转换为.mkv文件
flvmuxgst-plugins-goodMux a raw data to a .flv file
将原始数据转换为.flv文件
avimuxgst-plugins-goodMux a raw data to a .avi file
将原始数据转换为.avi文件
mp4muxgst-plugins-goodMux a raw data to a .mp4 file
将原始数据转换为.mp4文件

2.6 i.MX专属插件 i.MX Proprietary Plugins

i.MX GStreamer支持以下专有插件,可以帮助用户达到更好的使用效果。

插件名称Package 插件包Description 解释
vpudecimx-gst1.0-pluginDecodes compressed video to raw data
解码压缩视频到原始数据
vpuenc_h264imx-gst1.0-pluginEncode raw data to compressed video
编码原始数据为压缩后的视频
vpuenc_vp8imx-gst1.0-pluginEncode raw data to compressed video
编码原始数据为压缩后的视频
imxcompositor_g2dimx-gst1.0-pluginComposite multiple video streams with HW acceleration
硬件加速复合多个视频流
imxvideoconvert_g2dimx-gst1.0-plugini.MX Video Convert Plugins with HW acceleration
硬件加速的视频转换插件

2.7 音频插件 Audio Plugins

音频插件负责整理来自音频原始格式或特定音频数据格式的数据,例如WAV

插件名称Package 插件包Description 解释
mpg123audiodecgst-plugins-goodMP3 decoding plugin based on the mpg123 library
基于mpg123库MP3解码插件
vorbisdecgst-plugins-baseDecodes raw vorbis streams to float audio
解码原始vorbis流到float音频
vorbisencgst-plugins-baseEncodes audio in Vorbis format
以Vorbis格式编码音频
alsasinkgst-plugins-baseOutput to a sound card via ALSA
通过ALSA输出到声卡
pulsesinkgst-plugins-goodPlays audio to a PulseAudio server
播放音频到PulseAudio服务器

2.8 图片插件 Image Plugins

图像插件负责整理来自图像原始格式或特定数据格式(如JPEG)的数据。、

插件名称Package 插件包Description 解释
jpegdecgst-plugins-goodDecode images from JPEG format
从JPEG格式解码图像
v4l2jpegdecgst-plugins-goodDecodes JPEG streams via V4L2 API
通过V4L2的API解码JPEG图像
pngdecgst-plugins-goodDecode a png video frame to a raw image
解码一帧png视频到原始图像
jpegencgst-plugins-goodEncode images in JPEG format
以JPEG格式编码视频
pngencgst-plugins-goodDecode a png video frame to a raw image
解码一帧png视频到原始图像
imagefreezegst-plugins-goodGenerates a still frame stream from an image
从图像生成静止帧

2.9 网络协议插件 Network Protocol Plugins

网络协议插件负责在网络上的设备之间建立连接。

插件名称Package 插件包Description 解释
udpsinkgst-plugins-goodSend data over the network via UDP
通过UDP在网络上发送数据
multiudpsinkgst-plugins-goodSend data over the network via UDP to one or multiple recipients
通过UDP在网络上发送数据给一个或多个接收者
udpsrcgst-plugins-goodReceive data over the network via UDP
通过UDP协议从网络上接收数据
tcpserversinkgst-plugins-baseSend data as a server over the network via TCP
以TPC服务器的形式像网络发送数据
tcpclientsrcgst-plugins-baseReceive data as a client over the network via TCP
以TPC客户端的形式从网络获取数据
rtspsrcgst-plugins-goodReceive data over the network via RTSP
通过rtsp从网络获取数据

2.10 负载/解负载插件 Payload/Depayload Plugins

负载插件负责通过网络打包数据。为了接收和解包它,解负载插件与这些插件结合使用。(这个负载和解负载的说法是我随便翻译的,没找到depayload的相关翻译)

插件名称Package 插件包Description 解释
gdppaygst-plugins-badPayloads GStreamer Data Protocol buffers
负载GStreamer数据协议缓冲
gdpdepaygst-plugins-badDepayloads GStreamer Data Protocol buffers
解负载GStreamer数据协议缓冲
rtpvrawpaygst-plugins-goodPayload raw video as RTP packets
以RTP包方式负载原始视频
rtpvrawdepaygst-plugins-goodExtracts raw video from RTP packets
从RTP包中提取原始视频
rtph264paygst-plugins-goodPayload-encode H264 video into RTP packets
将H.264视频编码为RTP数据包用于数据传输
rtph264depaygst-plugins-goodExtracts H264 video from RTP packets
从RTP包中提取H264视频
rtpmpapaygst-plugins-goodPayload MPEG audio as RTP packets
将MPEG音频编码为RTP数据包用于数据传输
rtpmpadepaygst-plugins-goodExtracts MPEG audio from RTP packets
从RTP包中提取MPEG音频
rtpjitterbuffergst-plugins-goodA buffer that deals with network jitter and other transmission faults
一种缓冲区,用于处理网络抖动和其他传输故障

章节3 解码样例 Decode Examples

本节展示如何使用一些GStreamer管道示例及其支持的设备进行视频解码。

3.1 i.MX 8M

i.m x8m系列采用了Hantro VPU IP。该VPU提供以下加速视频解码器解决方案。

3.1.1. H.264/H.265/VP8 解码 (硬件加速解码)

gst-launch-1.0 filesrc location=<filename.mp4> ! qtdemux name=d d.video_0 ! queue ! h264parse ! vpudec ! queue ! waylandsink

vpudec提供了对多种视频格式的支持。为了正确使用它,一定要确定根据具体编码情况情况配置解析器参数:

  • H.264: h264parse;
  • H.265: h265parse;
  • VP8: 不需要解析插件

3.2 i.MX 8X/8QM

i.MX 8QXP和i.MX 8QM soc配备了Amphion VPU IP。该VPU提供以下加速视频解码器解决方案。

3.2.1. H.264 解码

gst-launch-1.0 filesrc location=<filename.mp4> ! qtdemux name=d d.video_0 ! queue ! h264parse ! v4l2h264dec ! imxvideoconvert_g2d ! queue ! waylandsink

Amphion VPU IP使用了特殊格式,需要用imxvideoconvert_g2d来解码

3.2.2. H.265 解码

gst-launch-1.0 filesrc location=<filename.mkv> ! qtdemux name=d d.video_0 ! queue ! h265parse ! v4l2h265dec ! imxvideoconvert_g2d ! queue ! waylandsink

3.2.3. MPEG-4 解码

gst-launch-1.0 filesrc location=<filename.mp4> !  qtdemux name=d d.video_0 ! queue ! mpeg4videoparse ! v4l2mpeg4dec ! imxvideoconvert_g2d ! queue ! waylandsink

3.2.4. MPEG-2 解码

gst-launch-1.0 filesrc location=<filename.ts> ! qtdemux name=d d.video_0 ! queue ! mpegvideoparse ! v4l2mpeg2dec ! imxvideoconvert_g2d ! queue ! waylandsink

3.2.5. VP6 解码

gst-launch-1.0 filesrc location=<filename.mp4> ! qtdemux name=d d.video_0 ! queue ! v4l2vp6dec ! imxvideoconvert_g2d ! queue ! waylandsink

3.2.6. VP8 解码

gst-launch-1.0 filesrc location=<filename.mp4> ! qtdemux name=d d.video_0 ! queue ! v4l2vp8dec ! imxvideoconvert_g2d ! queue ! waylandsink

章节4 编码样例 Encode Examples

这部分内容展示如何使用Gstream管道去编码的样例以及适配的设备

4.1. i.MX 8M

i.m x8m系列采用了Hantro VPU IP。该VPU提供以下加速视频编码解决方案。

4.1.1. H.264 编码(硬件加速)

gst-launch-1.0 videotestsrc ! video/x-raw, format=I420, width=640, height=480 ! vpuenc_h264 ! filesink location=test.mp4

i.MX 8M Quad EVK和i.MX 8M Nano EVK不支持硬件加速编码

4.1.2. VP8 编码(硬件加速)

gst-launch-1.0 videotestsrc ! video/x-raw, format=I420, width=640, height=480 ! vpuenc_vp8 ! matroskamux ! filesink location=test.mkv

4.2. i.MX 8X/8QM

i.MX 8QXP和i.MX 8QM 系列配备了Amphion VPU IP。该VPU提供以下加速视频编码器解决方案。

4.2.1. H.264 编码(硬件加速)

gst-launch-1.0 videotestsrc ! video/x-raw, format=NV12, width=640, height=480 ! v4l2h264enc ! filesink location=test.mp4

4.2.2. 额外的V4L2控制

v4l2-ctl --list-ctrls -d /dev/video13

输出如下:

User Controls
min_number_of_output_buffers (int) : min=1 max=32 step=1 default=3 value=3 flags=read-only, volatile
Codec Controls
video_b_frames (int) : min=0 max=4 step=1 default=2 value=2 flags=update
video_gop_size (int) : min=1 max=300 step=1 default=30 value=30 flags=volatile, execute-on-write
video_bitrate_mode (menu) : min=0 max=1 default=0 value=0 flags=update
video_bitrate (int) : min=16384 max=251658240 step=1024 default=2097152 value=2097152
video_peak_bitrate (int) : min=16384 max=251658240 step=1024 default=8388608 value=8388608
force_key_frame (button) : flags=write-only, execute-on-write
h264_i_frame_qp_value (int) : min=0 max=51 step=1 default=25 value=25
h264_p_frame_qp_value (int) : min=0 max=51 step=1 default=25 value=25
h264_b_frame_qp_value (int) : min=0 max=51 step=1 default=25 value=25
h264_i_frame_period (int) : min=1 max=300 step=1 default=30 value=30 flags=volatile, execute-on-write
h264_level (menu) : min=0 max=15 default=11 value=11
h264_profile (menu) : min=0 max=4 default=0 value=0
h264_arbitrary_slice_ordering (int) : min=0 max=1 step=1 default=1 value=1

根据提供的信息编码参数配置如下:

gst-launch-1.0 v4l2src device=/dev/video1 ! video/x-raw,width=640,height=480 ! v4l2h264enc extra-controls="controls,h264_entropy_mode=0,video_bitrate=245000;" ! h264parse ! v4l2h264dec ! queue ! waylandsink sync=false

减少CPU的占用可以使用如下指令

gst-launch-1.0 v4l2src device=/dev/video1 ! video/x-raw,width=640,height=480 ! v4l2h264enc extra-controls="controls,h264_entropy_mode=0,video_bitrate=245000;" ! h264parse ! v4l2h264dec ! queue ! waylandsink sync=false

章节5 复用、解复用样例Mux/demux Examples

本节将展示一些最常用的mux和demux插件,以及如何正确使用它们的一些示例

  • Mux在音视频中的含义
    • 在音视频处理领域,"mux"是"Multiplex"的缩写,意味着“多路传输”或“混流”。它指的是将视频、音频、字幕等多种媒体流按照特定的容器格式封装到一个单一的文件中的过程。这样做可以使得不同类型的媒体数据能够协同工作,便于存储和传输。在播放时,可以通过解复用(demuxing)操作将这些流分开,以便独立解码和播放

5.1. 复用插件 Mux Plugins

5.1.1. qtmux

此插件将视频和(或)音频流混合到一个QucikTime(.mov)文件中

gst-launch-1.0 v4l2src num-buffers=500 ! video/x-raw,width=320,height=240 ! videoconvert ! qtmux ! filesink location=video.mov

上面的管道将摄像机视频记录到.mov文件

5.1.2. matroskamux

此插件将视频和(或)音频流混合到一个a Matroska (.MKV)文件中

gst-launch-1.0 filesrc location=<AUDIO_FILE>.mp3 ! mpegaudioparse ! matroskamux ! filesink location=test.mkv

上面的管道将mp3视频记录到.mkv文件

5.1.3. mp4mux

此插件将视频和(或)音频流混合到一个ISO MPEG-4 (.mp4)文件中

gst-launch-1.0 v4l2src num-buffers=50 ! queue ! vpudec ! mp4mux ! filesink location=video.mp4

上面的管道描述了从v4l2设备录制视频的过程,并将其编码为H.264格式并转换成.mp4文件。

5.1.4. flvmux

此插件将视频和(或)音频流混合到一个a flash video (.FLV)文件中

gst-launch-1.0 filesrc location=<AUDIO_FILE>.mp3 ! decodebin ! queue ! flvmux name=mux ! filesink location=test.flv filesrc location=<VIDEO_FILE>.mp4 ! decodebin ! queue ! mux

上面的管道将解码一个音视频文件到.flv文件

5.1.5. avimux

此插件将视频和(或)音频流混合到一个 .AVI 文件中

gst-launch-1.0 videotestsrc num-buffers=300 ! 'video/x-raw,format=I420,width=640,height=480,framerate=30/1' avimux ! filesink location=test.avi

5.2. 解复用插件 Demux Plugins

5.2.1. aiurdemux

这种类型的demuxer是NXP的专有插件,可以自动检测文件编码并转换为原始的未解析文件

gst-launch-1.0 filesrc location=<VIDEO_FILE>.mp4 ! video/quicktime ! aiurdemux ! queue max-size-time=0 ! vpudec ! autovideosink

5.2.2. qtdemux

解复用.mov文件转换为原始的raw文件。

 gst-launch-1.0 filesrc location=<VIDEO_FILE>.mov ! qtdemux name=demux demux.audio_0 ! queue ! decodebin ! audioconvert ! audioresample ! autoaudiosink demux.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! autovideosink

5.2.3. matroskademux

解复用.mkv文件转换为原始的raw文件。

gst-launch-1.0 filesrc location=<VIDEO_FILE>.mkv ! matroskademux ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink

5.2.4. flvdemux

解复用.flv文件转换为原始的raw文件。

gst-launch-1.0 filesrc location=<VIDEO_FILE>.flv ! flvdemux ! audioconvert ! autoaudiosink

5.2.5. avidemux

解复用.avi文件转换为原始的raw文件。

gst-launch-1.0 filesrc location=<VIDEO_FILE>.avi ! avidemux name=demux demux.audio_0 ! decodebin ! audioconvert ! audioresample ! autoaudiosink demux.video_0 ! decodebin ! videoconvert ! videoscale ! autovideosink

章节6 相机样例 Camera Examples

本节展示如何使用GStreamer管道及其对应指令支持的设备执行相机捕获。不同模型之间的差异见下文。

6.1. 拍照 Camera Capture

首先用以下指令来获取本地的视频输出设备及其相关参数

gst-device-monitor-1.0

这个指令打印的内容如下

Device found:
  name : i.MX6S_CSI //名称
  class : Video/Source//支持的流为视频流
  caps : video/x-raw, format=(string)YUY2, width=(int)2592, height=(int);
  video/x-raw, format=(string)YUY2, width=(int)1920, height=(int);
  video/x-raw, format=(string)YUY2, width=(int)1280, height=(int);
  video/x-raw, format=(string)YUY2, width=(int)720, height=(int)4;
  video/x-raw, format=(string)YUY2, width=(int)640, height=(int)4;
  video/x-raw, format=(string)YUY2, width=(int)320, height=(int)2;//支持这么些格式
  properties:
  udev-probed = true
  device.bus_path = platform-32e20000.csi1_bridge
  sysfs.path = /sys/devices/platform/32e20000.csi1_bridge/video4l0
  device.subsystem = video4linux
  device.product.name = i.MX6S_CSI
  device.capabilities = :capture:
  device.api = v4l2
  device.path = /dev/video0           //设备路径映射
  v4l2.device.driver = mx6s-csi
  v4l2.device.card = i.MX6S_CSI
  v4l2.device.bus_info = platform:32e20000.csi1_bridge
  v4l2.device.version = 267043 (0x00041323)
  v4l2.device.capabilities = 2216689665 (0x84200001)
  v4l2.device.device_caps = 69206017 (0x04200001)
  gst-launch-1.0 v4l2src ! ...

  • 此命令可以输出相机等各种重要信息如分辨率、帧率和支持的格式

也可以使用如下指令来获取视频输出设备

v4l2-ctl --list-devices

这条指令会输出的内容如下

vpu B0 (platform:):
  /dev/video12
  /dev/video13
mxc-isi (platform:58100000.isi.0):
  /dev/video0
  /dev/video5
mxc-isi (platform:58110000.isi.1):
  /dev/video1
mxc-isi (platform:58120000.isi.2):
  /dev/video2
mxc-isi (platform:58130000.isi.3):
  /dev/video3
mxc-jpeg decoder (platform:58400000.jpegdec):
  /dev/video4
mxc-jpeg decoder (platform:58450000.jpegenc):
  /dev/video6

可以用如下指令来自动将CSI协议获取到的数据传输到合适的屏幕上

gst-launch-1.0 v4l2src device=/dev/videoX ! autovideosink

6.2. 改变相机分辨率和帧率 Changing the Camera Resolution and Framerate

要改变相机的分辨率和帧率请示入以下配置参数的指令

gst-launch-1.0 v4l2src ! video/x-raw, width=<WIDTH>, height=<HEIGHT>, framerate=<FRAMERATE> ! autovideosink

上述指令中的WIDTH参数、HEIGHT、FRAMERATE参数是自己进行配置的

以将输出修改为高清1280*720为例子

gst-launch-1.0 v4l2src ! 'video/x-raw,framerate=30/1,width=1280,height=720' ! autovideosink

如果要将帧率改为60帧请输入以下指令

gst-launch-1.0 v4l2src ! 'video/x-raw,framerate=60/2,width=1280,height=720' ! autovideosink

6.3. 同时用多个摄像头 Using Multiple Cameras

i.MX 8QXP MEK C0 和 i.MX 8QM MEK支持多个摄像头

使用以下指令来在同一个输出设备显示所有的摄像头的内容

gst-launch-1.0 imxcompositor_g2d name=comp \
  sink_0::xpos=0 sink_0::ypos=0 sink_0::width=640 sink_0::height=480 \
  sink_1::xpos=0 sink_1::ypos=480 sink_1::width=640 sink_1::height=480 \
  sink_2::xpos=640 sink_2::ypos=0 sink_2::width=640 sink_2::height=480 \
  sink_3::xpos=640 sink_3::ypos=480 sink_3::width=640 sink_3::height=480 ! \
  video/x-raw,format=RGB16 ! waylandsink \
  v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480 ! comp.sink_0 \
  v4l2src device=/dev/video1 ! video/x-raw,width=640,height=480 ! comp.sink_1 \
  v4l2src device=/dev/video2 ! video/x-raw,width=640,height=480 ! comp.sink_2 \
  v4l2src device=/dev/video3 ! video/x-raw,width=640,height=480 ! comp.sink_3

章节7 音频样例

本章介绍了基础的音频播放管道样例

7.1音频播放样例

音频播放包括根据确定的文件格式播放确定的音频文件的过程。在下面的示例中,使用audiotestsrc插件将标准音频输出到音频接口:

gst-launch-1.0 audiotestsrc wave=5 ! alsasink device=plughw:1

如果要查看全部输出设备并修改输出设备请运行以下指令

pactl list sinks

运行结果如下

Sink #0
        State: IDLE
        Name: alsa_output.platform-sound-bt-sco.stereo-fallback
        Description: Built-in Audio Stereo
        Driver: module-alsa-card.c
        Sample Specification: s16le 2ch 48000Hz
        Channel Map: front-left,front-right
        Owner Module: 6
        Mute: no
        Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
                balance 0.00
        Base Volume: 65536 / 100% / 0.00 dB
        Monitor Source: alsa_output.platform-sound-bt-sco.stereo-fallback.monitor
        Latency: 74399 usec, configured 99937 usec
        Flags: HARDWARE DECIBEL_VOLUME LATENCY 
        Properties:
                alsa.resolution_bits = "16"
                device.api = "alsa"
                device.class = "sound"
                alsa.class = "generic"
                alsa.subclass = "generic-mix"
                alsa.name = ""
                alsa.id = "30c20000.sai-bt-sco-pcm-wb bt-sco-pcm-wb-0"
                alsa.subdevice = "0"
                alsa.subdevice_name = "subdevice #0"
                alsa.device = "0"
                alsa.card = "0"
                alsa.card_name = "bt-sco-audio"
                alsa.long_card_name = "bt-sco-audio"
                device.bus_path = "platform-sound-bt-sco"
                sysfs.path = "/devices/platform/sound-bt-sco/sound/card0"
                device.form_factor = "internal"
                device.string = "hw:0"
                device.buffering.buffer_size = "19188"
                device.buffering.fragment_size = "6396"
                device.access_mode = "mmap"
                device.profile.name = "stereo-fallback"
                device.profile.description = "Stereo"
                device.description = "Built-in Audio Stereo"
                module-udev-detect.discovered = "1"
                device.icon_name = "audio-card"
        Ports:
                analog-output: Analog Output (priority: 9900)
        Active Port: analog-output
        Formats:
                pcm

7.2 音频解码样例

以下管道样例采用filesrc插件解码本地音频

7.2.1 播放MP3格式格式音频文件

gst-launch-1.0 filesrc location=<audio_file.mp3> ! mpegaudioparse ! mpg123audiodec ! audioconvert ! alsasink device=plughw:1

7.2.2 播放Ogg Vorbis格式音频文件

gst-launch-1.0 filesrc location=<audio_file.ogg> ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! alsasink device=plughw:1

7.3 改变音频格式

音频转换是将音频文件的当前格式更改为另一种所需格式的过程。例如将.wav更改为.aac。
在下面描述的管道中,将使用一些情况作为示例。

7.3.1 将MP3改为Ogg Vorbis格式音频文件

gst-launch-1.0 filesrc location=Sweet.mp3 ! audioconvert ! vorbisenc ! oggmux ! filesink location=output.ogg

7.3.1 将WAV改为MP3格式音频文件

gst-launch-1.0 filesrc location=<audio_file.wav> ! wavparse ! avenc_mp2 ! filesink location=output.mp3

7.4 音频录制

除了音频回放和文件格式转换,还可以录制外部音频源,如麦克风连接到插孔输入。
下面描述的管道显示了获取这种类型的音频文件并将其保存为Ogg Vorbis文件的过程:

gst-launch-1.0 -v pulsesrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=alsasrc.ogg

章节8 图片样例

本章节介绍了使用gstream进行图片输出的基础管道

8.1 图片输出

图像输出包括在所需屏幕或任何其他类型的输出源上显示所需图像文件的过程。下面描述的管道执行这个过程

8.1.1 显示PNG照片

gst-launch-1.0 filesrc location=<output_image>.png ! pngdec ! imagefreeze ! videoconvert ! autovideosink

8.1.2 显示JPEG格式图片

gst-launch-1.0 -v filesrc location=<output_image>.jpeg ! jpegdec ! imagefreeze ! videoconvert ! autovideosink

8.2 拍摄照片

8.2.1 原始视频流获取JPG

gst-launch-1.0 v4l2src num-buffers=1 ! jpegenc ! filesink location=capture.jpg

8.2.2 原始视频流获取PNG

gst-launch-1.0 v4l2src num-buffers=1 ! pngenc ! filesink location=capture.png

8.2.3 原始视频流获取JPEG

gst-launch-1.0 v4l2src num-buffers=1 ! jpegenc ! filesink location=capture.jpeg

8.3 JPEG VPU支持

i.MX 8QM和i.MX 8QXP支持JPEG VPU编码和v4l2jpegenc插件。例子如下

gst-launch-1.0 v4l2src num-buffers=1 ! v4l2jpegenc ! filesink location=capture.jpeg

章节9 转码样例

本节展示了如何执行通用i.MX8板所需的一些转码管道,以及如何正确运行这些管道指令

9.1 视频转码

下面的示例将从摄像机获得的MJPEG文件转码为MKV文件

gst-launch-1.0 v4l2src device=/dev/video0 ! jpegparse ! v4l2jpegdec ! queue ! videoconvert ! v4l2h264enc ! h264parse ! matroskamux !
filesink location=out.mkv

在某些情况下,管道使用了大量来自电路板的处理能力,在这种情况下,可取的是使用零复制方法与管道,如下所示

gst-launch-1.0 v4l2src num-buffers=300 io-mode=dmabuf ! v4l2h264enc output-io-mode=dmabuf-import ! h264parse ! v4l2h264dec !
imxvideoconvert_g2d ! waylandsink

有关此类进程的更多信息,请参阅零复制管道章节。

章节10 视频流

本章节介绍了如何在支持的设备上用Gstreamr管道播放视频、录像、音频流

10.1 视频文件流

10.1.1 视频UDP流

  • 服务
gst-launch-1.0 -v filesrc location=<filename.mp4> ! \
  qtdemux ! queue ! rtph264pay ! \
  udpsink host=<CLIENT_IP>

为了推UDP流, 服务管道需要需要使能 -v,这个指令的输出如下

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:sink: caps = video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)4,
profile=(string)high,
codec_data=(buffer)01640028ffe1001e67640028acd940780227e5c05a808080a0000003002000000641e30632c001000568e93b2c8bfdf8f800, width=(int)1920,
height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709
/GstPipeline:pipeline0/GstQueue:queue0.GstPad:sink: caps = video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)4,
profile=(string)high,
codec_data=(buffer)01640028ffe1001e67640028acd940780227e5c05a808080a0000003002000000641e30632c001000568e93b2c8bfdf8f800, width=(int)1920,
height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0.GstPad:src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000,
encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)640028, sprop-parametersets=(string)"Z2QAKKzZQHgCJ+XAWoCAgKAAAAMAIAAABkHjBjLA\,aOk7LIs\=", payload=(int)96, ssrc=(uint)1622932748, timestampoffset=(uint)2591288474, seqnum-offset=(uint)8760, a-framerate=(string)25
/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encodingname=(string)H264, packetization-mode=(string)1, profile-level-id=(string)640028, sprop-parametersets=(string)"Z2QAKKzZQHgCJ+XAWoCAgKAAAAMAIAAABkHjBjLA\,aOk7LIs\=", payload=(int)96, ssrc=(uint)1622932748, timestampoffset=(uint)2591288474, seqnum-offset=(uint)8760, a-framerate=(string)25
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0.GstPad:sink: caps = video/x-h264, stream-format=(string)avc, alignment=(string)au,
level=(string)4, profile=(string)high,
codec_data=(buffer)01640028ffe1001e67640028acd940780227e5c05a808080a0000003002000000641e30632c001000568e93b2c8bfdf8f800, width=(int)1920,
height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0: timestamp = 2591288474
/GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0: seqnum = 8760
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock

通过检查输出值,搜索caps = "application/x-rtp"并复制其值。

  • 客户端

CLIENT管道必须使用caps值,所以导出caps值:

export CAPS='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1,
profile-level-id=(string)640028, sprop-parameter-sets=(string)"Z2QAKKzZQHgCJ+XAWoCAgKAAAAMAIAAABkHjBjLA\,aOk7LIs\=", payload=(int)96,
ssrc=(uint)1622932748, timestamp-offset=(uint)2591288474, seqnum-offset=(uint)8760, a-framerate=(string)25'

然后运行以下管道指令

 gst-launch-1.0 udpsrc caps = $CAPS ! \
  rtpjitterbuffer latency=100 ! queue max-size-buffers=0 ! \
  rtph264depay ! decodebin ! autovideosink sync=false

10.1.2 多路推流UDP

  • 服务
gst-launch-1.0 -v filesrc location=<filename.mp4> ! \
  qtdemux ! queue ! rtph264pay ! \
  multiudpsink clients=<CLIENT_IP_1>:5000,<CLIENT_IP_2>:5004
  • 客户端1
gst-launch-1.0 udpsrc port=5000 caps = $CAPS ! \
  rtpjitterbuffer latency=100 ! queue max-size-buffers=0 ! \
  rtph264depay ! decodebin ! autovideosink sync=false
  • 客户端2
gst-launch-1.0 udpsrc port=5004 caps = $CAPS ! \
  rtpjitterbuffer latency=100 ! queue max-size-buffers=0 ! \
  rtph264depay ! decodebin ! autovideosink sync=false

10.1.3 推流TCP

  • 服务
gst-launch-1.0 filesrc location=<video_file>.mov ! \
  decodebin ! vpuenc_h264 gop-size=2 bitrate=10000 ! \
  rtph264pay pt=96 timestamp-offset=0 ! gdppay ! \
  tcpserversink blocksize=512000 host=<SERVER_IP> port=8554 sync=false

  • 客户端1
gst-launch-1.0 tcpclientsrc host=<SERVER_IP> port=8554 ! gdpdepay ! queue max-size-buffers=0 ! \
  'application/x-rtp, framerate=(fraction)24/1, media=(string)video, clock10-rate=(int)90000, payload=(int)96' ! \
  rtpjitterbuffer latency=100 ! rtph264depay ! \
  decodebin ! autovideosink sync=false

10.1.4 RTSP流

  • 服务
gst-variable-rtsp-server -p 9001 -u \
  "filesrc location=<filename.mp4> ! \
  qtdemux ! queue ! rtph264pay name=pay0 pt=96"
  • 客户端1
gst-launch-1.0 rtspsrc location=rtsp://$SERVERIP:9001/stream ! \
  queue ! rtph264depay ! v4l2h264dec ! autovideosink

10.1.5 PC/VLC

  • 服务
gst-launch-1.0 -v filesrc location=<video_file>.mov ! \
  qtdemux ! rtph264pay ! \
  udpsink host=<CLIENT_IP> port=5004

在Linux PC中创建一个名为test_video.sdp。并将以下内容复制到其中

  • 客户端
v=0
m=video 5000 RTP/AVP 96
c=IN IP4 <SERVER_IP>
a=rtpmap:96 H264/90000
a=fmtp:96 sprop-parameter-sets=J01AHqkYGwe83gDUBAQG2wrXvfAQ=,KN4JyA=;

然后启动服务器并使用VLC应用程序打开该文件。

10.2 摄像头流

10.2.1 UDP

  • 服务
gst-launch-1.0 -v v4l2src device=/dev/video0 ! 'video/x-raw,width=1280,height=720' ! \
  rtpvrawpay pt=96 timestamp-offset=0 ! queue max-size-buffers=0 ! \
  udpsink host=<CLIENT_IP>
  • 客户端
gst-launch-1.0 udpsrc caps = $CAPS ! \
  rtpjitterbuffer latency=1 ! queue max-size-buffers=0 ! \
  rtpvrawdepay ! autovideosink sync=false

10.2.2 TCP

  • 服务
gst-launch-1.0 v4l2src device=/dev/video0 ! 'video/x-raw,width=1280,height=720' ! \
  rtpvrawpay pt=96 timestamp-offset=0 ! queue max-size-buffers=0 ! gdppay ! \
  tcpserversink blocksize=512000 host=<SERVER_IP> port=8554 sync=false
  • 客户端
gst-launch-1.0 tcpclientsrc host=<SERVER_IP> port=8554 ! gdpdepay ! queue max-size-buffers=0 ! \
  'application/x-rtp, framerate=(fraction)24/1, media=(string)video, clock10-rate=(int)90000, payload=(int)96' ! \
  rtpjitterbuffer latency=100 ! rtpvrawdepay ! \
  decodebin ! autovideosink sync=false

10.2.3 RTSP

运行RTSP的管道前请检查支持文档

  • 服务
 gst-variable-rtsp-server -p 9001 -u \
  "v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480 ! \
  v4l2h264enc ! rtph264pay name=pay0 pt=96"
  • 客户端
gst-launch-1.0 rtspsrc location=rtsp://$SERVERIP:9001/stream ! \
  queue ! rtph264depay ! v4l2h264dec ! autovideosink

10.3 音频流

10.3.1 UDP

  • 服务
 gst-launch-1.0 -v filesrc location=<audio_file>.mp3 ! \
  id3demux ! mpegaudioparse ! rtpmpapay ! \
  udpsink host=<CLIENT_IP> port=5004
  • 客户端
gst-launch-1.0 udpsrc port=5004 caps= $CAPS ! \
  rtpmpadepay ! queue ! \
  beepdec ! alsasink sync=false

10.3.2 PC/PLC

  • 服务
gst-launch-1.0 filesrc location=<audio_file>.mp3 ! \
  id3demux ! mpegaudioparse ! rtpmpapay ! \
  udpsink host=<CLIENT_IP> port=5004

在Linux PC中创建一个名为test_audio.sdp。并将以下内容复制到其中

  • 客户端
v=0
m=audio 5004 RTP/AVP 98
c=IN IP4 <SERVER_IP>
a=rtpmap:98 MP4A-LATM/48000

10.4 视频加音频流

10.4.1 PC/VLC

  • 服务
gst-launch-1.0 -v filesrc location=<video_file>.mov ! qtdemux name=demux \
  demux. ! queue ! rtph264pay name=pay0 pt=96 ! udpsink host=<CLIENT_IP> port=5000 sync=false \
  demux. ! queue ! mpegaudioparse ! rtpmpapay ! udpsink host=<CLIENT_IP> port=5004 sync=false

在Linux PC中创建一个名为test_audio.sdp。并将以下内容复制到其中

  • 客户端
v=0
m=video 5000 RTP/AVP 96
c=IN IP4 <SERVER_IP>
a=rtpmap:96 H264/90000
a=fmtp:96 sprop-parameter-sets=J01AHqkYGwe83gDUBAQG2wrXvfAQ=,KN4JyA=;
m=audio 5004 RTP/AVP 98
a=rtpmap:98 MP4A-LATM/48000

章节11 多显示器样例

一些i.mx8设备支持多个显示输出。本节将介绍如何启用它们。

11.1 i.MX 8M Quad EVK

为了在i.MX 8M Quad EVK上启用双显示支持,将/dtb更改为fsl-imx8mq-evk-dualdisplay.dtb。本地HDMI将由dcs控制器处理并达到4k 60fps,而MIPIDSI将由LCDIF控制并达到720 60fps。

11.1.1 Waylandsink + Kmssink

gst-launch-1.0 videotestsrc ! "video/x-raw,width=1920,height=1080" ! waylandsink \  videotestsrc ! "video/x-raw,width=1280,height=720" ! kmssink

11.1.2. Kmsink Framebuffer + DRM

 gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! \
  kmssink driver-name=mxsfb-drm \
  videotestsrc ! "video/x-raw,width=1920,height=1080" ! \
  kmssink driver-name=imx-drm

11.2. i.MX 8QM and i.MX 8QXP

i.MX 8QM MEK可以处理多达四个监视器。然而,就像i.MX 8QXP一样,它需要鼠标在这些显示器上导航以启用它。为了在这些设备上支持多个显示,移动鼠标,点击屏幕,然后运行GStreamer管道。
对每个监视器重复此过程。

章节12 视频布局

这是一种GStreamer来输出多个视频的方法,这在很多应用中十分有效且这是一个在必要场合十分常见的解决方法
对于i.mx8设备,在Weston/Wayland上创建视频构图的唯一可用解决方案是使用GPU来处理屏幕位置。所以本节中的所有GStreamer管道都使用imxcompositor_g2d插件

12.1. i.MX 8M

12.1.1 视频组合样例

gst-launch-1.0 -v imxcompositor_g2d name=comp \
  sink_0::xpos=0 sink_0::ypos=0 sink_0::width=640 sink_0::height=480 \
  sink_1::xpos=0 sink_1::ypos=480 sink_1::width=640 sink_1::height=480 ! \
  waylandsink \
  videotestsrc ! comp.sink_0 \
  videotestsrc ! comp.sink_1

12.1.2 视频解码样例

这个样例展示如何显示九个独立解码的H264视频流

gst-launch-1.0 -v imxcompositor_g2d name=comp \
  sink_0::xpos=0 sink_0::ypos=0 sink_0::width=1280 sink_0::height=720 \
  sink_1::xpos=0 sink_1::ypos=720 sink_1::width=1280 sink_1::height=720 \
  sink_2::xpos=0 sink_2::ypos=1440 sink_2::width=1280 sink_2::height=720 \
  sink_3::xpos=1280 sink_3::ypos=0 sink_3::width=1280 sink_3::height=720 \
  sink_4::xpos=1280 sink_4::ypos=720 sink_4::width=1280 sink_4::height=720 \
  sink_5::xpos=1280 sink_5::ypos=1440 sink_5::width=1280 sink_5::height=720 \
  sink_6::xpos=2560 sink_6::ypos=0 sink_6::width=1280 sink_6::height=720 \
  sink_7::xpos=2560 sink_7::ypos=720 sink_7::width=1280 sink_7::height=720 \
  sink_8::xpos=2560 sink_8::ypos=1440 sink_8::width=1280 sink_5::height=720 \
  waylandsink sync=false filesrc location=<HD_video_file> ! decodebin ! imxvideoconvert_g2d ! tee name=t \
  t. ! queue ! comp.sink_0 \
  t. ! queue ! comp.sink_1 \
  t. ! queue ! comp.sink_2 \
  t. ! queue ! comp.sink_3 \
  t. ! queue ! comp.sink_4 \
  t. ! queue ! comp.sink_5 \
  t. ! queue ! comp.sink_6 \
  t. ! queue ! comp.sink_7 \
  t. ! queue ! comp.sink_8

适用情况同上

12.1.3 两个视频的组合样例

在本例中,它使用MINISAS-TO-CSI子卡和USB网络摄像头

gst-launch-1.0 -v imxcompositor_g2d name=comp \
  sink_0::xpos=0 sink_0::ypos=0 sink_0::width=640 sink_0::height=480 \
  sink_1::xpos=0 sink_1::ypos=480 sink_1::width=640 sink_1::height=480 ! \
  video/x-raw,format=RGB16 ! autovideosink \
  v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480 ! comp.sink_0 \
  v4l2src device=/dev/video1 ! video/x-raw,width=640,height=480 ! comp.sink_1

以上三种的管道不适用于i.MX 8M Nano EVK,因为它没有Imxcompositor_g2d插件支持。

12.2. i.MX 8QXP/QM

12.2.1 视频组成样例

gst-launch-1.0 -v imxcompositor_g2d name=comp \
  sink_0::xpos=0 sink_0::ypos=0 sink_0::width=640 sink_0::height=480
  sink_1::xpos=0 sink_1::ypos=480 sink_1::width=640 sink_1::height=480 ! \
  waylandsink \
  videotestsrc ! comp.sink_0 \
  videotestsrc ! comp.sink_1

12.2.2 九个视频解码组合样例

这个样例不同于imx 8M,是同时解码不同的九个视频

gst-launch-1.0 -v imxcompositor_g2d name=comp \
  sink_0::xpos=0 sink_0::ypos=0 sink_0::width=1280 sink_0::height=720 \
  sink_1::xpos=0 sink_1::ypos=720 sink_1::width=1280 sink_1::height=720 \
  sink_2::xpos=0 sink_2::ypos=1440 sink_2::width=1280 sink_2::height=720 \
  sink_3::xpos=1280 sink_3::ypos=0 sink_3::width=1280 sink_3::height=720 \
  sink_4::xpos=1280 sink_4::ypos=720 sink_4::width=1280 sink_4::height=720 \
  sink_5::xpos=1280 sink_5::ypos=1440 sink_5::width=1280 sink_5::height=720 \
  sink_6::xpos=2560 sink_6::ypos=0 sink_6::width=1280 sink_6::height=720 \
  sink_7::xpos=2560 sink_7::ypos=720 sink_7::width=1280 sink_7::height=720 \
  sink_8::xpos=2560 sink_8::ypos=1440 sink_8::width=1280 sink_5::height=720 \
  ! waylandsink sync=false \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_0 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_1 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_2 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_3 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_4 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_5 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_6 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_7 \
  filesrc location=<video_file> ! decodebin ! imxvideoconvert_g2d ! comp.sink_8

12.2.3 八个摄像头采集样例

接下来的这个样例使用了两个MX8XMIPI4CAM2的子卡和八个MCIMXCAMERA1MP相机,能够在一个输出同时显示八个不同的画面

gst-launch-1.0 -v imxcompositor_g2d name=comp \
  sink_0::xpos=0 sink_0::ypos=0 sink_0::width=320 sink_0::height=240 \
  sink_1::xpos=0 sink_1::ypos=240 sink_1::width=320 sink_1::height=240 \
  sink_2::xpos=320 sink_2::ypos=0 sink_2::width=320 sink_2::height=240 \
  sink_3::xpos=320 sink_3::ypos=240 sink_3::width=320 sink_3::height=240 \
  sink_4::xpos=640 sink_4::ypos=0 sink_4::width=320 sink_4::height=240 \
  sink_5::xpos=640 sink_5::ypos=240 sink_5::width=320 sink_5::height=240 \
  sink_6::xpos=960 sink_6::ypos=0 sink_6::width=320 sink_6::height=240 \
  sink_7::xpos=960 sink_7::ypos=240 sink_7::width=320 sink_7::height=240 ! \
  video/x-raw,format=RGB16 ! waylandsink \
  v4l2src device=/dev/video0 ! video/x-raw,width=320,height=240 ! comp.sink_0 \
  v4l2src device=/dev/video1 ! video/x-raw,width=320,height=240 ! comp.sink_1 \
  v4l2src device=/dev/video2 ! video/x-raw,width=320,height=240 ! comp.sink_2 \
  v4l2src device=/dev/video3 ! video/x-raw,width=320,height=240 ! comp.sink_3 \
  v4l2src device=/dev/video4 ! video/x-raw,width=320,height=240 ! comp.sink_4 \
  v4l2src device=/dev/video5 ! video/x-raw,width=320,height=240 ! comp.sink_5 \
  v4l2src device=/dev/video6 ! video/x-raw,width=320,height=240 ! comp.sink_6 
  • 值得注意的是i.MX 8QXP只支持一个MX8XMIPI4CAM2子卡

章节13 视频缩放与旋转

这个章节将教会你如何进行视频的旋转以及这些指令支持的设备

对于i.mx8设备,在Weston/Wayland上创建视频构图的唯一可用解决方案是使用GPU来处理屏幕位置。所以本节中的所有GStreamer管道都使用imxcompositor_g2d插件

13.1 i.MX 8

13.1.1视频缩放

使用glimagesink - render_rectangle插件演示不同的缩放效果(一般是自带的不需要另外下载)

VGA的显示

gst-launch-1.0 filesrc location=<name_of_the_video.mp4> ! qtdemux ! h264parse ! vpudec ! queue ! glimagesink render-rectangle='<0, 0,
720, 480>'

全画幅高清

gst-launch-1.0 filesrc location=<name_of_the_video.mp4> ! qtdemux ! h264parse ! vpudec ! queue ! glimagesink render-rectangle='<0, 0,
1920, 1080>'

13.1.2 视频旋转

使用glimagesink - render_rectangle插件来旋转视频

旋转90度

gst-launch-1.0 filesrc location=<name_of_the_video.mp4> ! qtdemux ! h264parse ! vpudec ! queue ! glimagesink rotate-method=1

旋转180度

gst-launch-1.0 filesrc location=<name_of_the_video.mp4> ! qtdemux ! h264parse ! vpudec ! queue ! glimagesink rotate-method=2

旋转270度

gst-launch-1.0 filesrc location=<name_of_the_video.mp4> ! qtdemux ! h264parse ! vpudec ! queue ! glimagesink rotate-method=3

章节14 零拷贝管道

本节使用GStreamer管道处理零拷贝操作。零拷贝是一种让CPU使用由一个元素产生的数据,但不需要任何类型的转换的操作。

14.1 添加缓冲区 Pushing buffers

使用缓冲区操作零拷贝管道的一种方法是使用io模式等属性。这个过程对于提高视频处理的执行速度非常有帮助。下面可以看到其中的一些类型

14.1.1 Dmabuf

dmabuf使用硬件DMA的缓冲区来执行零拷贝管道,如下所示

gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=300 io-mode=dmabuf ! \
  'video/x-raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1' ! \
  queue ! v4l2h264enc output-io-mode=dmabuf-import ! avimux ! filesink location=test.avi

在这个管道中,RAW格式由io模式属性存储,然后在H.264格式编码过程中进一步使用

14.1.2 MMAP

MMAP是内核提供的一个内存分配进程,它可以执行零拷贝过程。使用示例如下所示

gst-launch-1.0 v4l2src io-mode=2 device=/dev/video0 do-timestamp=true ! \
  'video/x-raw, width=1280, height=720, framerate=30/1, format=UYVY' ! autoconvert ! \
  'video/x-raw, width=1280, height=720, framerate=30/1, format=I420' ! autovideosink sync=false

14.2 CPU表现

在上面描述的管道中,当比较CPU使用情况和每种类型的缓冲区使用情况时,可以看出,采用零拷贝降低了CPU使用率,如下表所示:

编码方式平均CPU占用
直接编码102%
DMA编码15%
MMAP编码70%

这些方式最高可以降低87%的CPU占用率

  • 对于上表中描述的测试,使用的板是i.MX 8QuadXPlus MEK B0,CPU占用率是通过top命令测量的,而其他单板可以显示不同管道的结果。

章节15 Debug工具

15.1 标准Debug

最常见的GStreamer调试工具是标准的。使用以下命令检查所有调试选项:

--gst-debug-help

下面的例子显示了缓冲区的移动:

 GST_DEBUG=GST_BUFFER:5 gst-launch-1.0 -v filesrc location=cut_bbb_720.mov ! \
 decodebin ! imxvideoconvert_g2d ! waylandsink sync=false

您可能注意到,视频性能受到控制台日志返回的影响。要避免这种情况,请保持调试内容在文件中

GST_DEBUG_FILE=gst_debug.log GST_DEBUG=GST_BUFFER:5 gst-launch-1.0 -v filesrc location=cut_bbb_720.mov ! \
 decodebin ! imxvideoconvert_g2d ! waylandsink sync=false

15.2 Graphviz图形化

调试管道及其功能的一种特殊方法是使用.dot文件,该文件可用于创建管道图。
用以下指令为它设置一个保存.dot文件的目录:

export GST_DEBUG_DUMP_DOT_DIR=/tmp/

设置完之后,运行以下指令

gst-launch-1.0 -v videotestsrc num-buffers=300 ! waylandsink

检查/tmp目录下生成的.dot文件,并将PLAYING_PAUSED文件复制到主机上。

在主机上,安装graphviz:

apt-get install graphviz

然后在主机上,将.dot文件转换为您喜欢的图像文件格式,在本例中为PNG

dot -Tpng <PLAYING_PAUSED_FILE>.dot > diagram.png

打开图片来确认结果

eog diagram.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值