【GStreamer 】Basic tutorials-Basic tutorial 1: Hello world!

这些教程描述了理解其余教程所需的一般主题。

子页面:
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 的命令行选项

如果您始终将命令行参数 argcargv 传递给 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.0gst-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 的第一个教程就结束了。我们希望它的简洁性可以作为该框架功能强大的一个例子!

让我们回顾一下。今天我们学习了:

下一个教程将继续介绍更多基本的 GStreamer 元素,并向您展示如何手动构建管道。

很高兴您能来这里,很快再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternal-Student

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值