历时一个月的Python Gstreamer入门阶段接近尾声,在这里总结一下自己的学习历程。首先感谢一下Andy同学和Stephen老师的帮助和指导。(根据后续学习持续更新)
首先需要了解Gstreamer是什么,有哪些基本的内容,element、pad、bin、pipeline各是什么,其中又有哪些分类。这里推荐Gsteamer的官方文档进行学习,可以去Gstreamer官网寻找英文文档,也可以直接搜索Gstreamer应用开发手册寻找中文版。Gstreamer是使用C语言编写的框架,网络上关于Gstreamer的资料也是C语言编写居多(这也是我想写一篇自己的Python Gstreamer学习历程的原因之一),不过不管是什么语言编写Gstreamer程序,基本的思路都是一样的,只是语句的表达方式不同而已,关于C语言和Python语言的函数对照表我后面也有提供。
这里推荐一个翻译的Gstreamer基础教程、播放教程博客:Gstreamer基础教程
常用知识总结:gstreamer知识总结
想要播放视频首先需要理解视频音频的编码与封装相关知识,这里推荐一个视音频编解码相关博客:视音频编解码技术零基础学习方法
一个mkv视频的形成过程为:视音频原始数据——>音视频编码形成压缩数据——>音视频封装为MKV等格式视频。相对应的我们播放一个视频就需要对这个过程翻转:MKV视频——>解封装——>解码——>播放。
图解:
对于Gstreamer的安装,Ubuntu可能会自带1.0版本,如果查找不到部分元件,可以搜索这些元件所属的插件包,这里提供一个元件和Gstreamer插件包对应的文档:gstreamer插件
下面根据顺序介绍一下我编写代码的过程以及部分代码:
(1)使用playbin实现对音视频的播放
playbin是一个集成的箱柜可以直接用来播放多种音视频。
(2)播放MP4、MKV等格式视频
在了解了播放视频的流程之后,播放视频最重要的一个环节是对解封装和解码元件的选择。这些我在这一个博客中有较为详细的讲解:使用python Gstreamer编写mp4视频播放器
(3)播放未知编码格式的视频
使用decodebin来实现对未知格式视频的播放。decodebin是一个集成的箱柜,具有解封装、分流、解码的功能。不过decodebin的衬垫也是随机衬垫,需要使用回调函数来实现对pad的连接。
这里我写了两个相关的博客,第一个博客完成了对一个未知音频编码格式的MKV文件的播放,但是对decodebin的理解和使用有一部分问题,地址如下:python Gstreamer 播放不同编码格式的视频文件
第二个博客改进了对decodebin的使用,并且学习了使用Gstreamer中的衬垫探测机制和阻塞来完成播放未知是否含有Audio的视频。博客地址:使用Gstreamer播放未知格式视频(python)。目前第二个程序还存在一个问题:视频开始播放后的短暂的时间内可能会出现没有声音的现象,我有空会尝试解决,也希望大家学习之后可以给我适当的建议。
对Gstreamer中衬垫探测机制和阻塞的使用参考了博客:pipeline动态连接
Gstreamer C语言和Python语言的函数对照表:C语言和Python语言的函数对照表
(4)播放根据rtsp协议编码视频(不包含音频)
RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议。关于播放rtsp协议编码的视频我在这个博客下有比较详细的介绍:Python Gstreamer播放rtsp视频流(海康IPCAM)
(5)播放根据rtsp协议编码包含音频的视频
代码详见此博客:Python Gstreamer播放rtsp视频(含音频)(海康IPCAM)
(6)将rtsp码流视频保存到本地
思路与代码详见博客:rtsp码流视频保存到本地
(7)python Gstreamer将视频逐帧保存为图片
同样可以理解为将视频截图,思路见博客:python Gstreamer将视频逐帧保存为图片
(8)python gstreamer 实现视频快进/快退/循环播放
使用Gst.Pad.query_duration,Gst.Pad.query_position,Gst.Element.seek_simple三个函数实现视频时长获取以及位置跳转,具体的函数描述以及代码实现见博客:python gstreamer 实现视频快进/快退/循环播放
插件的制作:gstreamer插件制作(插件内使用c++和opencv)
插件知识总结:gstreamer插件知识总结
联系客服