本文根据GStreamer官方文档书写,用于学习和备忘。
提示:以下是本篇文章正文内容,下面案例可供参考
对一个软件库而言,没有什么比能在屏幕上打印出“Hello World”更好的第一印象了!
但由于我们使用的是多媒体框架,我们将播放视频。
准备好您的第一个GStreamer应用程序……
basic-tutorial-1.py
#!/usr/bin/env python3
import sys
import gi
gi.require_version('GLib', '2.0')
gi.require_version('GObject', '2.0')
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, GLib
pipeline = None
bus = None
message = None
# initialize GStreamer
Gst.init(sys.argv[1:])
# build the pipeline
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)
只需使用python3 basic-tutorial-1.py
指令即可运行该文件
本教程将打开一个窗口并显示一个带有音频的电影。
音频是从互联网获取的,所以窗口可能需要几秒钟才能出现,这取决于你的网速。此外,没有延迟管理(缓冲),所以在慢速连接上,电影可能会在几秒钟后停止。所以在慢速连接时,电影可能会在几秒钟后停止。看看Basic tutorial 12: Streaming(基础教程12;流)是如何解决这个问题的。
让我们回顾一下这几行代码,看看它们是做什么的:
# initialize GStreamer
Gst.init(sys.argv[1:])
这必须始终是您的第一个GStreamer命令。其中, Gst.init():
如果你总是将命令行参数argc和argv传递给gst_init(),你的应用程序将自动从GStreamer标准命令行选项中受益(更多相关内容见 Basic tutorial 10: GStreamer tools)
# build the pipeline
pipeline = Gst.parse_launch(
"playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm"
)
这一行是本教程的核心内容,并举例说明了两个关键点:Gst.parse_launch()和playbin。
GStreamer是一个用于处理多媒体流的框架。音频从“source(源)”elements到“sink(汇)”element,经过一系列执行各种任务的中间elements。所有相互连接的元件(elements)的集合称为“管道(pipeline)”。
在GStreamer中,你通常通过手工组装单个元element来构建管道,但是,当管道足够简单,而且你不需要任何高级功能时,你可以采用捷径:gst_parse_launch().
这个函数接受pipeline的文本表示,并将其转换为实际的管道,这非常方便。事实上,这个函数非常方便,有一个完全围绕它构建的工具,您将非常熟悉(请参阅基础教程10:GStreamer工具,了解gst-launch-1.0和gst-launch-1.0语法)。
那么,我们要求gst_parse_launch()为我们构建什么样的管道呢?这里是第二个重点::我们正在构建一个由一个名为playbin的element组成的管道。
Playbin是一个特殊的element,它既是source也是sink,自己又是一个完整的管道。在内部,它创建并连接所有必要的elements来播放你的音频,所以你不必担心它。
它没有手工组成的管道所具有的控制精细度,但是它仍然允许足够的定制以满足广泛的应用程序。包括本教程。
在这个例子中,我们只向playbin传递了一个参数,这是我们想要播放的媒体的URI。试着把它改成别的东西!无论是http://
还是file://
URI, playbin都会正确地将GStreamer源代码实例化!
如果输入错误的URI,或者文件不存在,或者缺少插件,GStreamer提供了几种通知机制,但是我们在本例中所做的唯一一件事就是在错误时退出,所以不要期望得到太多反馈。
# start playing
pipeline.set_state(Gst.State.PLAYING)
这一行代码强调了另一个有趣的概念:state(状态)。每个GStreamer中的element都有一个相应的状态,可以比喻为普通DVD播放机中的播放/暂停状态。现在,只有当你将管道状态设置为PLAYING
时,音频回放才会开始。
在这一行中,Gst.Element.set_state()将pipeline
(我们唯一的element,记住)设置为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
)
这些代码指令将一直等待,直到程序运行发生错误或找到流(stream)的末尾。 Gst.Element.get_bus()检索管道的总线。并且Gst.Bus.timed_pop_filtered()为阻塞(block)状态,直到你通过该总线接收到一个ERROR或者一个EOS
(end - stream)才会导通。不要太担心这一行指令,GStreamer总线在基础教程2:GStreamer概念中有解释。
这就是这段代码的作用。从现在开始,GStreamer将负责一切。当音频到达它的音频流结尾(EOS)或遇到错误时(尝试关闭视频窗口或拔下网络电缆),执行将结束。通过在控制台中按control+C,应用程序总是可以停止。
但是,在终止应用程序之前,我们需要做几件事情来进行清理工作。
# free resources
pipeline.set_state(Gst.State.NULL)
在退出之前,管道状态应该总是被设置回Gst.State.NULL。
GStreamer的第一个教程到此结束。我们希望它的简短可以作为这个框架多么强大的一个例子!
让我们回顾一下。今天我们学到:
gst_init
()初始化GStreamergst_parse_launch
()从文本描述快速构建管道。playbin
element创建一个自动播放管道。Gst.Element.set_state
().通知GStreamer开始播放。Gst.Element.get_bus()
和Gst.Bus.timed_pop_filtered()
来获取总线状态。