当前位置:   article > 正文

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

linux 推流软件

之前尝试了在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文件里写入教程代码

  1. import gi
  2. # 导入包一定要声明版本,不然报错
  3. gi.require_version('GLib', '2.0')
  4. gi.require_version('GObject', '2.0')
  5. gi.require_version('Gst', '1.0')
  6. gi.require_version('GstRtspServer', '1.0')
  7. from gi.repository import Gst, GstRtspServer, GObject, GLib
  8. import sys
  9. pipeline = None
  10. bus = None
  11. message = None
  12. # Gstreamer把数据流从source(源)端传到sink(汇)端,中间经过一系列执行任务的中间element(元件),所有
  13. # 相互连接的集合元件就叫管道(pipeline)
  14. # initialize GStreamer
  15. # 这个是应用Gstreaner的第一个命令,即初始化
  16. # 初始化内部的所有结构,检查可用插件,执行用于Gstreamer的命令行选项
  17. Gst.init(sys.argv[1:])
  18. # build the pipeline
  19. # 这个函数接收pipeline的文本表示,并将其转换为实际的管道
  20. # 不考虑高级功能的时候用这个就行
  21. # Playbin是一个特殊的element,它既是source也是sink,自己又是一个完整的管道。
  22. # 在内部,它创建并连接所有必要的elements来播放数据
  23. # 这里放了一个连接,可以改成别的试试,我试了试USB摄像头,没成功.....
  24. pipeline = Gst.parse_launch(
  25. "playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm"
  26. )
  27. # start playing
  28. # 这里是配置,设置开始播放
  29. pipeline.set_state(Gst.State.PLAYING)
  30. # wait until EOS or error
  31. # 这个是等着你出错报错的,要是不出错或者流没有放完,就一直等着
  32. bus = pipeline.get_bus()
  33. msg = bus.timed_pop_filtered(
  34. Gst.CLOCK_TIME_NONE,
  35. Gst.MessageType.ERROR | Gst.MessageType.EOS
  36. )
  37. # free resources
  38. # 最后在退出应用之前清理管道状态
  39. 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摄像头

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/420430
推荐阅读
相关标签
  

闽ICP备14008679号