Gstreamer使用说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gstreamer使用说明相关的知识,希望对你有一定的参考价值。

参考技术A

Application Development Manual

Gstreamer是一个支持Windows,Linux,androidios的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。

GStreamer 的核心功能是为插件、数据流和媒体类型处理/协商提供框架。它还提供了一个 API 来使用各种插件编写应用程序。

GStreamer 提供

Gstreamer框架根据各个模块的成熟度以及所使用的开源协议,将core及plugins置于不同的源码包中:

Element是Gstreamer中最重要的对象类型之一。一个element实现一个功能(读取文件,解码,输出等),程序需要创建多个element,并按顺序将其串连起来(使用管道 ! ),构成一个完整的pipeline。

官方Elements与Plugins Lists

element主要有三种:

pads 是元素与外界的接口,有两个属性定义:方向和可用性。两个element必须通过pad才能连接起来,在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。一个element可以同时拥有多个相同的pad。

bin 是一个容器元素,用于管理多个element。由于 bin 本身就是一个元素,因此可以以与任何其他元素相同的方式处理 bin。改变bin的状态时,bin会自动去修改所包含的element的状态,也会转发所收到的消息。如果没有bin,我们需要依次操作我们所使用的element。通过bin降低了应用的复杂度。

Pipeline继承自bin,为程序提供一个bus用于传输消息,并且对所有子element进行同步。当将pipeline的状态设置为PLAYING时,pipeline会在一个/多个新的线程中通过element处理数据。

示例:通过下面的命令播放文件时,会创建如下pipeline:

这个pipeline由8个element构成,每个element都实现各自的功能:

filesrc读取文件,oggdemux解析文件,分别提取audio,video数据,queue缓存数据,vorbisdec解码audio,autoaudiosink自动选择音频设备并输出;theoradec解码video,videoconvert转换video数据格式,autovideosink自动选择显示设备并输出。

参考 Installing on Linux

API reference

示例应用helloworld.c

编译应用

如何使用 Gstreamer 通过 RTMP 流式传输?

【中文标题】如何使用 Gstreamer 通过 RTMP 流式传输?【英文标题】:How to stream via RTMP using Gstreamer? 【发布时间】:2017-01-09 15:05:06 【问题描述】:

我正在尝试使用 Gstreamer 将视频和音频流式传输到 RTMP 服务器 (Wowza),但存在许多问题。

几乎没有关于如何正确使用rtmpsink 的文档,这是一个通过 RTMP 将媒体发送到指定服务器的插件。不仅如此,制作与rtmpsink 兼容的正确 Gstreamer 管道目前只是一个试错练习。

我目前的 Gstreamer 管道是:

sudo gst-launch-1.0 -e videotestsrc ! queue ! videoconvert ! x264enc ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://<ip_address>/live live=true'

在我的 Linux 机器上运行上面的代码会出现这个错误:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstRTMPSink:rtmpsink0: Could not     open resource for writing.
Additional debug info:
gstrtmpsink.c(246): gst_rtmp_sink_render (): /GstPipeline:pipeline0/GstRTMPSink:rtmpsink0:
Could not connect to RTMP stream "rtmp://31.24.217.8/live live=true" for writing
EOS on shutdown enabled -- waiting for EOS after Error
Waiting for EOS...
ERROR: from element /GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0: Internal data flow error.
Additional debug info:
gstbasesrc.c(2948): gst_base_src_loop (): /GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0:
streaming task paused, reason error (-5)
ERROR: from element /GstPipeline:pipeline0/GstQueue:queue0: Internal data flow error.
Additional debug info:
gstqueue.c(992): gst_queue_handle_sink_event (): /GstPipeline:pipeline0/GstQueue:queue0:
streaming task paused, reason error (-5)

由于在 Wowza 方面缺乏文档,另一个问题实际上是指出正确的 IP 地址指向 rtmpsink 并且在 Gstreamer 方面缺乏文档,除了一些示例之外,正确的 RTMP 身份验证是难以捉摸的由于其他变量,无法确认其论坛是否有效。

使用rtmpsink 通过RTMP 进行流式传输的正确Gstreamer 管道是什么?我如何正确地实现rtmpsink,无论是否经过身份验证?

【问题讨论】:

【参考方案1】:

实际上您使用的管道运行良好。

但是,禁用Wowza的RTMP安全是必须的,也指向了正确的方向。

遵循下一页的指南:https://www.wowza.com/forums/content.php?36-How-to-set-up-live-streaming-using-an-RTMP-based-encoder

重新检查应用程序中是否启用了 RTMP播放类型

禁用所有安全选项以确保 GStreamer 兼容性。

播放安全选项卡中,检查是否选择了无客户端限制(默认选中)。

Sources 选项卡的左侧列中,可以检查服务器设置:

完成所有这些步骤后,我们可以启动之前的管道:

gst-launch-1.0 -e videotestsrc ! queue ! videoconvert ! x264enc ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://192.168.1.40:1935/livertmp/myStream'

它可以工作,并且可以单击 Test Players 按钮检查结果。结果如下:

虽然可能超出范围,但可以将音频添加到管道并添加一些缺少的属性来改进它:

gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! x264enc bitrate=1000 tune=zerolatency ! video/x-h264 ! h264parse ! video/x-h264 ! queue ! flvmux name=mux ! rtmpsink location='rtmp://192.168.1.40:1935/livertmp/myStream' audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.

关于密码加密内容,用GStreamer实现起来并不简单。

【讨论】:

感谢您的回复。我已完全按照您的指示进行操作,但在启动管道 sudo gst-launch-1.0 -e videotestsrc ! queue ! videoconvert ! x264enc ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://192.168.78.10:1935/live/myStream' 时会导致与前面描述的行为相同的行为。但是,其他观察结果,将其指向 Wowza 服务器的公共 IP 地址会立即失败并出现上述错误,但使用 192.168.78.10 的本地 IP(由 Wowza 提供)会导致它尝试工作一分钟左右,然后再抛出相同的错误错误。 感谢您的帮助。事实证明,防火墙阻止了 1935 端口上的通信,因此无法通过 RTMP 建立连接。 另一个后续问题,我有一个管道sudo gst-launch-1.0 shmsrc socket-path=/tmp/mixer1 do-timestamp=true is-live=true ! 'video/x-raw, format=BGRA, pixel-aspect-ratio=1/1, interlace-mode=progressive, framerate=24/1, width=1024, height=576' ! videoconvert ! x264enc bitrate=1024 ! h264parse ! flvmux name=mux streamable=true ! rtmpsink location='rtmp://192.168.78.10:1935/live/RTMPStream' 报告它正在接收数据但只播放黑屏。将其更改为udpsink 并通过 VLC 播放成功。你知道可能是什么问题吗?

以上是关于Gstreamer使用说明的主要内容,如果未能解决你的问题,请参考以下文章

官方教程中的GStreamer示例不能使用GStreamer 1.14.1在Ubuntu 18.04上运行

使用自动工具链接 gstreamer 插件中的外部库

使用Gstreamer 作为数据源输出视频数据 VI 集成gstreamer

GStreamer使用总结

如何使用 Gstreamer 通过 RTMP 流式传输?

deepstream学习笔记:gstreamer与deepstream-test1说明