Gstreamer基础教程1:hello world! python


前言

本文根据GStreamer官方文档书写,用于学习和备忘。

提示:以下是本篇文章正文内容,下面案例可供参考

一、本节目标

对一个软件库而言,没有什么比能在屏幕上打印出“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://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():

  1. 初始化所有内部结构
  2. 检查可用的插件
  3. 执行任何用于GStreamer的命令行选项

如果你总是将命令行参数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

gst_parse_launch

GStreamer是一个用于处理多媒体流的框架。音频从“source()”elements到“sink()”element,经过一系列执行各种任务的中间elements。所有相互连接的元件(elements)的集合称为“管道(pipeline)”。
在GStreamer中,你通常通过手工组装单个元element来构建管道,但是,当管道足够简单,而且你不需要任何高级功能时,你可以采用捷径:gst_parse_launch().
这个函数接受pipeline的文本表示,并将其转换为实际的管道,这非常方便。事实上,这个函数非常方便,有一个完全围绕它构建的工具,您将非常熟悉(请参阅基础教程10:GStreamer工具,了解gst-launch-1.0gst-launch-1.0语法)。

playbin

那么,我们要求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,应用程序总是可以停止。

Cleanup

但是,在终止应用程序之前,我们需要做几件事情来进行清理工作。

# free resources
pipeline.set_state(Gst.State.NULL)

在退出之前,管道状态应该总是被设置回Gst.State.NULL

四、总结

GStreamer的第一个教程到此结束。我们希望它的简短可以作为这个框架多么强大的一个例子!
让我们回顾一下。今天我们学到:

  1. 如何使用gst_init()初始化GStreamer
  2. 如何使用gst_parse_launch()从文本描述快速构建管道。
  3. 如何使用playbin element创建一个自动播放管道。
  4. 如何使用Gst.Element.set_state().通知GStreamer开始播放。
  5. 如何使用GStreamer使用Gst.Element.get_bus()Gst.Bus.timed_pop_filtered()来获取总线状态。
    下一篇教程将继续介绍更多基础的GStreamer元素,并向您展示如何手动构建管道。
    很高兴你在这里,期待再次见面!
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值