赞
踩
之前尝试了在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)
会从网上拉一段视频下来,说明环境配好了
可以看到这个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然后进行处理。
由于工作内容安排原因暂时搁置
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。