目录
1、jpegenc 编码
1.1 USB相机YUV格式的编码成jpeg图片
USB相机一般输出YUV原始数据,无法直接保存成可显示的图片,一般图片格式都是经过编码压缩的,使用jpegenc插件,可以实现RAW格式数据输入后,编码成输出image/jpeg格式。
查询插件信息: 挑一些重点信息说一下:这个地方说明了sink的格式要求,src输出的格式要求。
nvidia@nvidia-desktop:~$ gst-inspect-1.0 jpegenc
Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
video/x-raw
format: { (string)I420, (string)YV12, (string)YUY2, (string)UYVY, (string)Y41B, (string)Y42B, (string)YVYU, (string)Y444, (string)NV21, (string)NV12, (string)RGB, (string)BGR, (string)RGBx, (string)xRGB, (string)BGRx, (string)xBGR, (string)GRAY8 }
width: [ 1, 2147483647 ]
height: [ 1, 2147483647 ]
framerate: [ 0/1, 2147483647/1 ]
SRC template: 'src'
Availability: Always
Capabilities:
image/jpeg
width: [ 16, 65535 ]
height: [ 16, 65535 ]
framerate: [ 0/1, 2147483647/1 ]
sof-marker: { (int)0, (int)1, (int)2, (int)4, (int)9 }
示例:
#jpegenc 输入video/x-raw个数,输出image/jpeg格式
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=5/1' \
! jpegenc ! filesink location=/home/nvidia/Pictures/file_1280_720_YUV_1401.jpg
#采集Size: Discrete 640x480 图片
gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 \
! 'video/x-raw,format=YUY2,width=640, height=480, framerate=25/1' \
! jpegenc ! filesink location=/home/nvidia/Pictures/file_640_480_YUV_1401.jpg
2.2 使用 videotestsrc 生成YUV测试
#jpegenc 输入video/x-raw个数,输出image/jpeg格式
gst-launch-1.0 videotestsrc num-buffers=1 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=25/1' \
! jpegenc ! filesink location=/home/nvidia/Pictures/file25_1280_720_YUV_1401.jpg
2、jpegdec 解码
jpegdec 的作用,是将image/jpeg 格式数据解码成为video/x-raw个数数据,和jpegenc 正好相反。
查询插件信息:
nvidia@nvidia-desktop:~$ gst-inspect-1.0 jpegdec
Factory Details:
Rank primary (256)
Long-name JPEG image decoder
Klass Codec/Decoder/Image
Description Decode images from JPEG format
Author Wim Taymans <wim@fluendo.com>
Plugin Details:
Name jpeg
Description JPeg plugin library
Filename /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstjpeg.so
Version 1.14.5
License LGPL
Source module gst-plugins-good
Source release date 2019-05-29
Binary package GStreamer Good Plugins (Ubuntu)
Origin URL https://launchpad.net/distros/ubuntu/+source/gst-plugins-good1.0
GObject
+----GInitiallyUnowned
+----GstObject
+----GstElement
+----GstVideoDecoder
+----GstJpegDec
Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
image/jpeg
SRC template: 'src'
Availability: Always
Capabilities:
video/x-raw
format: { (string)I420, (string)RGB, (string)BGR, (string)RGBx, (string)xRGB, (string)BGRx, (string)xBGR, (string)GRAY8 }
width: [ 1, 2147483647 ]
height: [ 1, 2147483647 ]
framerate: [ 0/1, 2147483647/1 ]
Element has no clocking capabilities.
Element has no URI handling capabilities.
Pads:
SINK: 'sink'
Pad Template: 'sink'
SRC: 'src'
Pad Template: 'src'
Element Properties:
name : The name of the object
flags: readable, writable
String. Default: "jpegdec0"
parent : The parent of the object
flags: readable, writable
Object of type "GstObject"
idct-method : The IDCT algorithm to use
flags: readable, writable
Enum "GstIDCTMethod" Default: 1, "ifast"
(0): islow - Slow but accurate integer algorithm
(1): ifast - Faster, less accurate integer method
(2): float - Floating-point: accurate, fast on fast HW
max-errors : (Deprecated) Error out after receiving N consecutive decoding errors (-1 = never fail, 0 = automatic, 1 = fail on first error)
flags: readable, writable, deprecated
Integer. Range: -1 - 2147483647 Default: 0
查询插件信息中:说明sink 的要求是image/jpeg,src 也就是输出的格式为video/x-raw。
Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
image/jpeg
SRC template: 'src'
Availability: Always
Capabilities:
video/x-raw
format: { (string)I420, (string)RGB, (string)BGR, (string)RGBx, (string)xRGB, (string)BGRx, (string)xBGR, (string)GRAY8 }
width: [ 1, 2147483647 ]
height: [ 1, 2147483647 ]
framerate: [ 0/1, 2147483647/1 ]
2.1 示例
#v4l2src 这是数据源控件,从相机取数据
#image/jpeg,width=1280,height=720,framerate=30/1 数据参数,需要和相机支持格式一致
#jpegdec 解码成video/x-raw 格式
#videoconvert 解码后我们需要将数据转成YUV做显示
#xvimagesink 这个大家应该要很熟悉,这个是显示插件
gst-launch-1.0 v4l2src device=/dev/video0 \
! image/jpeg,width=1280,height=720,framerate=30/1 \
! jpegdec ! videoconvert ! xvimagesink
#必须相机支持这种格式才可以
gst-launch-1.0 v4l2src device=/dev/video0 \
! image/jpeg,width=640,height=480,framerate=30/1 \
! jpegdec ! videoconvert ! xvimagesink
2.2 综合示例
我们先使用videotestsrc生成任意时间长度,大小,帧率的视频,然后再解码播放视频。
生成测试视频
#使用videotestsrc 生成任意指定的大小和帧率的image/jpeg测试视频
#videotestsrc 输出的格式为video/x-raw
#num-buffers=100 采集100帧
#avimux AVI格式生成器
# filesink location=/home/nvidia/Pictures/jpeg-1280-720-25.avi 保存文件插件
gst-launch-1.0 videotestsrc num-buffers=100 \
! 'video/x-raw,format=YUY2,width=1280, height=720, framerate=25/1' \
! jpegenc ! avimux ! filesink location=/home/nvidia/Pictures/jpeg-1280-720-25.avi
gst-launch-1.0 videotestsrc num-buffers=100 \
! 'video/x-raw,format=YUY2,width=640, height=480, framerate=30/1' \
! jpegenc ! avimux ! filesink location=/home/nvidia/Pictures/jpeg-640-480-30.avi
播放视频
#filesrc 与 filesink 对应,读取文件插件
#avidemux 与 avimux 对应,将AVI文件格式解码成单独的音频和视频
#queue 理解为单独建立一个现场
# jpegdec 解码
# videoconvert 转换成显示格式
gst-launch-1.0 -v filesrc location=/home/nvidia/Pictures/jpeg-1280-720-25.avi ! avidemux \
! queue ! jpegdec ! videoconvert \
! videoscale ! xvimagesink
gst-launch-1.0 -v filesrc location=/home/nvidia/Pictures/jpeg-640-480-30.avi ! avidemux \
! queue ! jpegdec ! videoconvert \
! videoscale ! xvimagesink