欢迎光临
我们一直在努力

05-第一个GStreamer-C++程序与Element模型

写出第一个 GStreamer C++ 程序,并看懂 Element 模型

专栏:GStreamer C++ 从零到工程实战 · 第 6 篇 / 共 17 篇

先用 gst_parse_launch 写出完整可运行的 C++ 程序,再从 Plugin、Factory、Registry、Property 和 Rank 深入理解 Element 对象模型。

第 4 课:第一个真正的 GStreamer C++ 程序

前面已经用命令验证:

gst-launch-1.0 videotestsrc num-buffers=120 ! autovideosink

现在把它放进 C++。

这一课先用:

gst_parse_launch()

原因很简单:

先学会正确管理 Pipeline 的完整生命周期,再学习逐个创建 Element。

一、程序的完整生命周期

在这里插入图片描述

图:一个完整 GStreamer 程序的生命周期

第一份程序已经包含真实项目最重要的骨架。

二、完整代码

main.cpp:

#include <gst/gst.h>

int main(int argc, char* argv[])
{


gst_init(&argc, &argv);

GError* parse_error = nullptr;
GstElement* pipeline = gst_parse_launch(
\”videotestsrc num-buffers=120 pattern=ball \”
\”! videoconvert \”
\”! autovideosink\”,
&parse_error);

if (!pipeline) {


g_printerr(\”Pipeline parse failed: %s\\n\”,
parse_error ? parse_error->message : \”unknown error\”);
g_clear_error(&parse_error);
return 1;
}

if (parse_error) {


g_printerr(\”Pipeline was created with a recoverable parse issue: %s\\n\”,
parse_error->message);
g_clear_error(&parse_error);
}

const GstStateChangeReturn state_result =
gst_element_set_state(pipeline, GST_STATE_PLAYING);

if (state_result == GST_STATE_CHANGE_FAILURE) {


g_printerr(\”Could not set pipeline to PLAYING\\n\”);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
return 1;
}

GstBus* bus = gst_element_get_bus(pipeline);
GstMessage* message = gst_bus_timed_pop_filtered(
bus,
GST_CLOCK_TIME_NONE,
static_cast<GstMessageType>(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

int exit_code = 0;

if (message && GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {


GError* error = n

赞(0)
未经允许不得转载:171主机测评 » 05-第一个GStreamer-C++程序与Element模型
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址