在Linux上用Gstreamer进行推流(1)

之前尝试了在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摄像头

由于工作内容安排原因暂时搁置

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值