GStreamer基础教程12 - 常用命令工具
摘要
GStreamer提供了不同的命令行工具用于快速的查看信息以及验证Pipeline的是否能够正确运行,在平时的开发过程中,我们也优先使用GStreamer的命令行工具验证,再将Pipeline集成到应用中。本文将介绍gst-inspect-1.0,gst-discoverer-1.0,gst-launch-1.0命令行工具的使用。
gst-inspect-1.0
此命令有3种工作模式,实际中我们常用第一种和第三种方式:
一、不带任何参数。这样会列出当前系统中支持的所有Element,这些Element可用于构造Pipeline.
二、跟文件名。这样会将指定文件作为一个GStreamer插件,尝试列出其中所包含的Element。例如下面的命令列出了libgstjpeg.so所包含的2个Elements:
$ gst-inspect-1.0 /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstjpeg.so
Plugin Details:
Name jpeg
Description JPeg plugin library
Filename /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstjpeg.so
Version 1.8.
License LGPL
Source module gst-plugins-good
Source release date --
Binary package GStreamer Good Plugins (Ubuntu)
Origin URL https://launchpad.net/distros/ubuntu/+source/gst-plugins-good1.0 jpegenc: JPEG image encoder
jpegdec: JPEG image decoder features:
+-- elements
三、跟Element名。会列出Element的详细信息。例如,下面的命令会列出jpeg解码器所支持的输入数据类型,Pad信息,支持的属性及值。我们主要关注Pad Template,以及Element的属性信息。
$ gst-inspect-1.0 jpegdec
Factory Details:
Rank primary ()
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/x86_64-linux-gnu/gstreamer-1.0/libgstjpeg.so
Version 1.8.
License LGPL
Source module gst-plugins-good
Source release date --
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: { I420, RGB, BGR, RGBx, xRGB, BGRx, xBGR, GRAY8 }
width: [ , ]
height: [ , ]
framerate: [ /, / ] Element Flags:
no flags set Element Implementation:
Has change_state() function: gst_video_decoder_change_state Element has no clocking capabilities.
Element has no indexing capabilities.
Element has no URI handling capabilities. Pads:
SINK: 'sink'
Implementation:
Has chainfunc(): gst_video_decoder_chain
Has custom eventfunc(): gst_video_decoder_sink_event
Has custom queryfunc(): gst_video_decoder_sink_query
Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
Pad Template: 'sink'
SRC: 'src'
Implementation:
Has custom eventfunc(): gst_video_decoder_src_event
Has custom queryfunc(): gst_video_decoder_src_query
Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
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: , "ifast"
(): islow - Slow but accurate integer algorithm
(): ifast - Faster, less accurate integer method
(): float - Floating-point: accurate, fast on fast HW
max-errors : (Deprecated) Error out after receiving N consecutive decoding errors (- = never fail, = automatic, = fail on first error)
flags: readable, writable, 0x80000000
Integer. Range: - - Default:
gst-discoverer-1.0
此命令在GStreamer基础教程06 - 获取媒体信息中使用过,是对GstDiscoverer接口的封装,可以方便的查看媒体文件的编码,帧率等信息。
$ gst-discoverer-1.0 sintel_trailer-480p.mp4
Analyzing file:///home/xleng/video/sintel_trailer-480p.mp4
Done discovering file:///home/xleng/video/sintel_trailer-480p.mp4 Topology:
container: Quicktime
audio: MPEG- AAC
video: H. (High Profile) Properties:
Duration: ::52.209000000
Seekable: yes
Live: no
Tags:
audio codec: MPEG- AAC audio
maximum bitrate:
datetime: --01T00::00Z
title: Sintel Trailer
artist: Durian Open Movie Team
copyright: (c) copyright Blender Foundation | durian.blender.org
description: Trailer for the Sintel open movie project
encoder: Lavf52.62.0
container format: ISO MP4/M4A
video codec: H. / AVC
bitrate:
gst-launch-1.0
gst-launch是我们平时使用最多的一个命令,它接收一个用字符串方式描述的Pipline,将其实例化并运行。我们可以用此命令快速的检查Pipeline中各个元素是否能够正确的连接起来。当我们需要构建的Pipeline很复杂时,我们也可以将Pipeline进行拆分,逐步通过gst-launch验证Pipeline的合法性。
通过gst-launch验证的字符串Pipeline可以直接使用gst_parse_launch()接口将其转化为GstPipeline对象,节省了我们单独调用API去创建Element的时间。
当我们用字符串描述Pipeline时,每个Element之间需要通过叹号 “!" 分隔Element,这样gst-launch才能正确识别。
在使用gst-launch时,根据不同的应用场景,我们可以分为以下的类型。
采用默认的参数创建Pipeline
这种方式我们只需将所使用的Element使用叹号分隔即可,例如:
$ gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
设置Element的属性
在某些情况下,我们需要修改Element的属性,或指定所需参数(例如playbin的uri参数),Element的属性直接跟在Element之后。下面的命令会设置videotestsrc的视频模式,输出图像为环形。属性支持的值可以通过gst-inspect命令查看。
$ gst-launch-1.0 videotestsrc pattern= ! videoconvert ! autovideosink
如果属性值中包含空格,我们可以将其置于单引号或双引号中。
$ gst-launch-1.0 -v videotestsrc ! clockoverlay halignment=right valignment=bottom text="Edge City" shaded-background=true font-desc="Sans, 36" ! videoconvert ! autovideosink
包含分支的Pipeline
每个Element都有name的属性,我们可以利用name来实现包含多个分支的复杂的Pipeline,这常见于有多个输出/输入的Element(mux,demux,tee等)。
下面的命令通过tee创建了2个分支,分别用于不同的sink,在一个分支是Pipeline完成后(到达sink),我们可以使用“name加一个点号”重新创建一个分支。
$ gst-launch-1.0 videotestsrc ! videoconvert ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink
使用同样的方式,我们也可以将多个分支合并为一个。下面的命令首先解码文件,将视频编码为H.264,音频编码为MP3,最终再合并生成TS文件。注意dmux和mux Element的使用。
$ gst-launch-1.0 filesrc location=surround.mp4 ! decodebin name=dmux ! queue ! audioconvert ! lamemp3enc ! mux. \
dmux. ! queue ! x264enc ! mpegtsmux name=mux ! queue ! filesink location=out.ts
指定Element的Pad
某些情况下,我们希望自己指定某个Pad用于连接,我们可以指定已命名Element的Pad来实现。
$ gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! \
matroskademux name=d d.video_00 ! matroskamux ! filesink location=sintel_video.mkv
上面的命令会将sintel_trailer-480p.webm文件进行Demux,只选择其中的视频(video_00),再将其保留为mk文件,只保留了视频部分。如果想只保留音频部分,可以使用如下命令:
$ gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! \
matroskademux name=d d.audio_00 ! vorbisparse ! matroskamux ! filesink location=sintel_audio.mka
上面两条命令均未对视频进行解码,只是将其从一个容器中拷入到另一个容器。
利用Caps Filter过滤码流
当Element包含多个输出Pad时,可能导致连接到下一个Element的Pad具有不确定性。在下一个Element支持当前Element所有的输出类型,这时GStreamer会随机选择一个Pad用于连接。
例如:我们无法确定下面的Pipeline会使用video_00还是audio_00连接到filesink,因为filesink同时支持audio及video输入。
$ gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux ! filesink location=test
我们可以如上一节所说,显式指定连接所用的Pad,或者使用Caps Filter:
$ gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! \
matroskademux ! video/x-vp8 ! matroskamux ! filesink location=sintel_video.mkv
Caps Filter表现为一个只接收指定数据类型的Element,并将数据传递到下一个Element,可以高效的解决二义性的问题。
我们可以使用gst-inspect查看Element的输出Pad,以决定我们的Caps Filter需要添加何种参数。在gst-launch后加 -v 参数可以输出Pipeline连接时所使用的Pad信息。
对于多个过滤条件,我们需要通过逗号隔开。
对于某些特殊的类型参数,GStreamer提供了相应的关键字来进行转换:
- i 或 int 表示整型或范围;
- f 或 float 表示浮点数及范围;
- 4 或 fourcc 表示4个字符的FOURCC 代码;
- b, bool, 或 boolean 表示布尔型数据;
- s, str, 或 string 表示字符串;
- fraction 表示分数(例如帧率, 像素宽高比);
- l 或 list 表示列表。
用于发送和接收UDP RTP数据:
$ gst-launch-1.0 v4l2src ! \
video/x-raw-yuv,width=,height=,format='(fourcc)'UYVY ! \
videoconvert ! ffenc_h263 ! video/x-h263 ! rtph263ppay pt= ! \
udpsink host=192.168.1.1 port= sync=false $gst-launch-1.0 udpsrc port= ! application/x-rtp, \
clock-rate=,payload= ! rtph263pdepay queue-delay= ! ffdec_h263 \
! xvimagesink
使用YUY2或YV12作为测试视频格式,帧率为30帧/秒:
$ gst-launch-1.0 videotestsrc ! \
'video/x-raw-yuv,format=(fourcc)YUY2,framerate=30/1;video/x-raw-yuv,format=(fourcc)YV12,framerate=30/1' \
! xvimagesink
通过alsasrc录制文件,限定采样率及位宽:
$ gst-launch-1.0 alsasrc! \
'audio/x-raw-int,rate=[32000,64000],width=[16,32],depth={16,24,32},signed=(boolean)true' \
! wavenc ! filesink location=recording.wav
总结
通过本文,我们掌握了:
- 如何通过gst-inspect-1.0查看当前系统所拥有的GStreamer插件以及每个插件的详细信息。
- 如何通过gst-discoverer-1.0查看媒体文件的Metadata。
- 如何通过gst-launch-1.0运行及测试Pipeline。
- 如果通过Caps Filter过滤指定数据。
引用
https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html?gi-language=c
https://gstreamer.freedesktop.org/documentation/tutorials/basic/gstreamer-tools.html?gi-language=c
GStreamer基础教程12 - 常用命令工具的更多相关文章
- 【GStreamer开发】GStreamer基础教程14——常用的element
目标 本教程给出了一系列开发中常用的element.它们包括大杂烩般的eleemnt(比如playbin2)以及一些调试时很有用的element. 简单来说,下面用gst-launch这个工具给出一个 ...
- 【GStreamer开发】GStreamer基础教程05——集成GUI工具
目标 本教程展示了如何在GStreamer集成一个GUI(比如:GTK+).最基本的原则是GStreamer处理多媒体的播放而GUI处理和用户的交互. 在这个教程里面,我们可以学到: 如何告诉GStr ...
- 【GStreamer开发】GStreamer基础教程12——流
目标 直接播放Internet上的文件而不在本地保存就被称为流播放.我们在前面教程里已经这样做过了,使用了http://的URL.本教程展示的是在播放流的时候需要记住的几个点,特别是: 如何设置缓冲 ...
- Docker基础教程(常用命令篇)
1.查看docker信息 # 查看docker版本 $docker version # 显示docker系统的信息 $docker info 2.启动容器 # 交互式 $docker run -it ...
- 【GStreamer开发】GStreamer基础教程10——GStreamer工具
目标 GStreamer提供了一系列方便使用的工具.这篇教程里不牵涉任何代码,但还是会讲一些有用的内容: 如何在命令行下建立一个pipeline--完全不使用C 如何找出一个element的Capab ...
- Linux基础 - 系统优化及常用命令
目录 Linux基础系统优化及常用命令 Linux基础系统优化 网卡配置文件详解 ifup,ifdown命令 ifconfig命令 ifup,ifdown命令 ip命令 用户管理与文件权限篇 创建普通 ...
- Linux基础系统优化及常用命令
# Linux基础系统优化及常用命令 [TOC] ## Linux基础系统优化 Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. - ...
- Linux 系统基础优化和常用命令
目录 Linux 系统基础优化和常用命令 软连接 tar解压命令 gzip命令 netstart命令 ps命令 kill命令 killall命令 SELinux功能 iptables防火墙 Linux ...
- GStreamer基础教程02 - 基本概念
摘要 在 Gstreamer基础教程01 - Hello World中,我们介绍了如何快速的通过一个字符串创建一个简单的pipeline.为了能够更好的控制pipline中的element,我们需要单 ...
随机推荐
- Knative 实战:基于 Knative Serverless 技术实现天气服务-上篇
提到天气预报服务,我们第一反应是很简单的一个服务啊,目前网上有大把的天气预报 API 可以直接使用,有必要去使用 Knative 搞一套吗?杀鸡用牛刀?先不要着急,我们先看一下实际的几个场景需求: 场 ...
- VR应用评测 - Apollo 11 阿波罗11号
Apollo 11 VR http://store.steampowered.com/app/457860/Apollo_11_VR/ Steam VR 2016年发布 好评率 50% 基于美国航空航 ...
- 面试题解析|ACL权限控制机制
ACL(Access Control List)访问控制列表 包括三个方面: 一.权限模式(Scheme) 1.IP:从 IP 地址粒度进行权限控制 2.Digest:最常用,用类似于 usernam ...
- linux登录后出现-bash-4.1$
linux登录后有时候会出现-bash-4.1$ 造成这样的原因: 与这个用户有关环境变量没了,有关的文件被删除.也就是用户的家目录下面 .bash_profile .bashrc 被删除. 解决办法 ...
- java架构之路-(Redis专题)Redis的高性能和持久化
上次我们简单的说了一下我们的redis的安装和使用,这次我们来说说redis为什么那么快和持久化数据 在我们现有的redis中(5.0.*之前的版本),Redis都是单线程的,那么单线程的Redis为 ...
- Unreal Engine 4 系列教程 Part 4:UI教程
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- Fiddle弱网测试
1.打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多: 接下来给大家解释一下这些个都是什么意 ...
- Python_生成随机验证码
内置函数 chr() ord() 这两个内置函数是用来对十进制(十六进制也可以)与ASCii之间进行转换 chr() : 将十进制转换成ASCii对应字母或符号 t_1 = chr(99) t_2 = ...
- 如何成为一个伟大的 JavaScript 程序员
这篇文章主要概述在我5年工作经验的基础上,我成为优秀JavaScript开发人员所使用的技术和资源. 当前大多数Web开发人员面临着这样一个共同的问题:他们必须在多个不同的领域领先于他人——从数据库到 ...
- 代码审计-Thinkphp3框架EXP表达式SQL注入
最近看java框架源码也是看的有点头疼,好多还要复习熟悉 还有好多事没做...慢慢熬. 网上好像还没有特别详细的分析 我来误人子弟吧. 0x01 tp3 中的exp表达式 查询表达式的使用格式: $m ...