写出第一个 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



