之前尝试了在x86和arm上的ffmpeg推流。现在大哥又让我看Gstreamer的推流。
这个windows平台好像教程不多,就直接用x86的Linux试一下了。
环境配置
安装Gstreamer,这么多包我估计也是可以源码编译的吧...
sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
安装gst-rtsp-server
sudo apt-get install libgstrtspserver-1.0-dev gstreamer1.0-rtsp
安装python3-gi
sudo apt-get install python3-gi
安装依赖库
sudo apt-get install pkg-config libcairo2-dev gcc python3-dev libgirepository1.0-dev
安装python库gobject和PyGObject
pip install gobject PyGObject
安装完成后在.py文件里写入教程代码
import gi
# 导入包一定要声明版本,不然报错
gi.require_version('GLib', '2.0')
gi.require_version('GObject', '2.0')
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GObject, GLib
import sys
pipeline = None
bus = None
message = None
# Gstreamer把数据流从source(源)端传到sink(汇)端,中间经过一系列执行任务的中间element(元件),所有
# 相互连接的集合元件就叫管道(pipeline)
# initialize GStreamer
# 这个是应用Gstreaner的第一个命令,即初始化
# 初始化内部的所有结构,检查可用插件,执行用于Gstreamer的命令行选项
Gst.init(sys.argv[1:])
# build the pipeline
# 这个函数接收pipeline的文本表示,并将其转换为实际的管道
# 不考虑高级功能的时候用这个就行
# Playbin是一个特殊的element,它既是source也是sink,自己又是一个完整的管道。
# 在内部,它创建并连接所有必要的elements来播放数据
# 这里放了一个连接,可以改成别的试试,我试了试USB摄像头,没成功.....
pipeline = Gst.parse_launch(
"playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm"
)
# start playing
# 这里是配置,设置开始播放
pipeline.set_state(Gst.State.PLAYING)
# wait until EOS or error
# 这个是等着你出错报错的,要是不出错或者流没有放完,就一直等着
bus = pipeline.get_bus()
msg = bus.timed_pop_filtered(
Gst.CLOCK_TIME_NONE,
Gst.MessageType.ERROR | Gst.MessageType.EOS
)
# free resources
# 最后在退出应用之前清理管道状态
pipeline.set_state(Gst.State.NULL)
会从网上拉一段视频下来,说明环境配好了
基本的Gstreamer运行理念
可以看到这个pipeline由8个element构成,每个element都实现各自的功能:
filesrc读取文件,oggdemux解析文件,分别提取audio,video数据,queue缓存数据,vorbisdec解码audio,autoaudiosink自动选择音频设备并输出,theoradec解码video,videoconvert转换video数据格式,autovideosink自动选择显示设备并输出。
不同的element拥有不同数量及类型的pad,只有src pad的element被称为source element,只有sink pad的被称为sink element。
element可以同时拥有多个相同的pad,例如oggdemux在解析文件后,会将audio,video通过不同的pad输出。
Pad是一个element的输入/输出接口,分为src pad(生产数据)和sink pad(消费数据)两种。
两个element必须通过pad才能连接起来,pad拥有当前element能处理数据类型的能力(capabilities),会在连接时通过比较src pad和sink pad中所支持的能力,来选择最恰当的数据类型用于传输,如果element不支持,程序会直接退出。在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。
通过Gstreamer播放USB摄像头
由于工作内容安排原因暂时搁置