这些教程描述了理解其余教程所需的一般主题。
子页面:
Basic tutorial 1: Hello world! – The mandatory ‘Hello world’ example
Basic tutorial 2: GStreamer concepts – Gstreamer Elements, Pipeline and the Bus
Basic tutorial 3: Dynamic pipelines
Basic tutorial 4: Time management
Basic tutorial 5: GUI toolkit integration
Basic tutorial 6: Media formats and Pad Capabilities
Basic tutorial 7: Multithreading and Pad Availability
Basic tutorial 8: Short-cutting the pipeline
Basic tutorial 9: Media information gathering
Basic tutorial 10: GStreamer tools
Basic tutorial 11: Debugging tools
Basic tutorial 12: Streaming
Basic tutorial 13: Playback speed
Basic tutorial 14: Handy elements
Basic tutorial 16: Platform-specific elements
Basic tutorial 1: Hello world!
目标
没有什么比在屏幕上打印“Hello World”更能给人留下对软件库的第一印象了!
但由于我们正在处理多媒体框架,因此我们将播放视频。
事不宜迟,准备好您的第一个 GStreamer 应用程序吧…
Hello world
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://gstreamer.freedesktop.org/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 运行该文件即可
本教程将打开一个窗口并显示一部电影,并附带音频。媒体是从互联网获取的,因此窗口可能需要几秒钟才能显示,具体取决于您的连接速度。此外,没有延迟管理(缓冲),因此在连接速度较慢的情况下,电影可能会在几秒钟后停止。查看基础教程 12:流媒体如何解决此问题。
演练(Walkthrough)
让我们回顾一下这些代码行,看看它们的作用:
# initialize GStreamer
Gst.init(sys.argv[1:])
这必须始终是您的第一个 GStreamer 命令。除其他事项外,Gst.init():
- 初始化所有内部结构
- 检查可用的插件
- 执行任何用于 GStreamer 的命令行选项
如果您始终将命令行参数 argc
和 argv
传递给 Gst.init():,您的应用程序将自动受益于 GStreamer 标准命令行选项(有关此内容的更多信息,请参阅基础教程 10:GStreamer 工具)
# build the pipeline
pipeline = Gst.parse_launch(
"playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm"
)
这行代码是本教程的核心,并举例说明了两个关键点:Gst.parse_launch() 和 playbin。
Gst.parse_launch
GStreamer 是一个用于处理多媒体流的框架。媒体从“源”元素(生产者)传到“接收器”元素(消费者),经过一系列执行各种任务的中间元素。所有互连元素的集合称为“管道”。
在 GStreamer 中,您通常通过手动组装各个元素来构建管道,但是,当管道足够简单并且您不需要任何高级功能时,您可以使用快捷方式:Gst.parse_launch。
此函数采用管道的文本表示并将其转换为实际管道,这非常方便。事实上,这个功能非常方便,有一个完全围绕它构建的工具,您会对它非常熟悉(参见基础教程 10:GStreamer 工具以了解gst-launch-1.0 和 gst-launch-1.0 语法)。
playbin
那么,我们要求 Gst.parse_launch() 为我们构建什么样的管道呢?这里进入第二个关键点:我们正在构建一个由一个名为 playbin 的元素组成的管道。
playbin 是一个特殊的元素,它充当源和接收器,是一个完整的管道。在内部,它创建并连接播放媒体所需的所有元素,因此您不必担心它。
它不允许手动管道所具有的控制粒度,但它仍然允许足够的自定义以满足广泛的应用程序。包括本教程。
在此示例中,我们仅将一个参数传递给 playbin ,即我们要播放的媒体的 URI。尝试将其更改为其他内容!无论是 http://
还是 file://
URI, playbin 都会透明地实例化适当的 GStreamer 源!
如果您输入了错误的 URI,或者文件不存在,或者您缺少插件,GStreamer 提供了几种通知机制,但在这个例子中我们唯一做的事情是在出现错误时退出,因此不要期待太多的反馈。
# start playing
pipeline.set_state(Gst.State.PLAYING)
这一行突出了另一个有趣的概念:状态。每个 GStreamer 元素都有一个关联状态,您可以将其或多或少地视为常规 DVD 播放器中的播放/暂停按钮。现在,可以说,除非您将管道设置为 PLAYING
状态,否则不会开始播放。
在这一行中,Gst.Element.set_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
)
这些行将等待,直到发生错误或找到流的末尾。Gst.Element.get_bus() 检索管道的总线,而 Gst.Bus.timed_pop_filtered() 将阻塞,直到您通过该总线收到 ERROR 或 EOS
(流末尾)。不要太担心这条线,GStreamer 总线在基础教程 2:GStreamer 概念中进行了解释。
就是这样!从现在开始,GStreamer 会处理所有事情。当媒体到达末尾(EOS)或遇到错误(尝试关闭视频窗口或拔下网线)时,执行将结束。始终可以通过在控制台中按 control-C 来停止应用程序。
清理
不过,在终止应用程序之前,我们需要做几件事来正确清理应用程序。
# free resources
pipeline.set_state(Gst.State.NULL)
退出之前应始终将管道状态设置回Gst.State.NULL 。
结论
至此,您使用 GStreamer 的第一个教程就结束了。我们希望它的简洁性可以作为该框架功能强大的一个例子!
让我们回顾一下。今天我们学习了:
- 如何使用 Gst.init(): 初始化 GStreamer。
- 如何使用 Gst.parse_launch 从文本描述快速构建管道。
- 如何使用 playbin创建自动播放管道。
- 如何使用Gst.Element.set_state() 向 GStreamer 发出信号以开始播放。
- 如何使用 Gst.Element.get_bus() 和 Gst.Bus.timed_pop_filtered() 坐下来放松,而GStreamer 会处理所有事情。
下一个教程将继续介绍更多基本的 GStreamer 元素,并向您展示如何手动构建管道。
很高兴您能来这里,很快再见!