调试gstreamer的gst-play

遇到问题不好查找原因时,在windows上用visual studio设断点调试能够提供一个便利。
gstreamer选择一个版本比如1.18.5,下载或者git clone源代码,下载gstreamer在windows上的安装包,安装包与源代码需要一致,断点跟踪的时候才能显示正确的执行语句。

在windows也能编译gstreamer,但是却需要一个msys或者mingw,这个没有尝试。

在windows上安装参照
https://gstreamer.freedesktop.org/documentation/installing/on-windows.html?gi-language=c

安装包下载位置
https://gstreamer.freedesktop.org/data/pkg/windows/1.18.5/msvc/

下载安装包

  • Development files installer: gstreamer-1.0-devel-msvc-x86_64-1.18.5.msi
  • Runtime installer: gstreamer-1.0-msvc-x86_64-1.18.5.msi
    参照 gstreamer安装(Windows + VS2022)
    因为是Linux下开发,windows只用于小的调试,所以没有配置visual studio
    主要包括下载runtime和sdk,然后配置E:\gstreamer\1.0\msvc_x86_64\bin环境变量到PATH,按照这个文档拷贝一下头文件glibconfig.h。

F:\gstreamer\1.0\msvc_x86_64\bin 因为windows下面的lib和exe都位于这个目录

获取源代码

  • https://gitlab.freedesktop.org/gstreamer/gst-build/-/tree/1.18.5

visual studio打开源代码:
调试gst-play位于gst-plugins-base,核心库gstreamer;另外插件可能位于不同的插件库,比如gst-plugins-good/gst-plugins-bad,这里在一个解决方案中加载了前三个工程

再说如何在visual studio上面打开正确打开源代码
从0开始打开visualstudio窗口,欢迎屏幕之后,既不打开已有,也不新建工程,而是选择“继续但无需代码”。
打开visual studio后,文件 > 新建 > 从现有代码新建项目;
项目类型 Visual Studio C++
找到项目位置,如D:\tmp\gst-build\subprojects\gst-plugins-good
设置项目名称gst-plugins-good,其他默认;
下一步
指定项目设置,您希望如何生成项目?
: 要使用外部生成系统
下一步
生成命令,随意,比如python -V,只有能正确返回就可以,不用于实际生成。
输出:E:\gstreamer\1.0\msvc_x86_64\bin\gst-play-1.0.exe最终启动并调试的程序
下一步
完成。
此时保存了项目,但没保存解决方案。

依次新建gst-plugins-base/gstreamer两个项目,在一个解决方案中加入三个工程。

visual studio项目属性
将其中一个项目设置为启动
启动工程的属性设置比较特殊,其他工程的设置可忽略或者与启动工程一致。
项目属性:
配置管理器中增加Win32平台,
配置Debug+Win32
调试 - 命令行参数输入播放文件路径
NMAKE - 常规 - 生成命令行 只要输入一个可以返回成功的命令即可,如:meson --version
NMAKE - 常规 - 输出,这个比较关键,是启动的exe,E:\gstreamer\1.0\msvc_x86_64\bin\gst-play-1.0.exe

这样F5的时候,限制性编译meson --version,通过后启动E:\gstreamer\1.0\msvc_x86_64\bin\gst-play-1.0.exe,在源代码的正确位置设置断点程序就会中断并调试状态。


Windows下面编译gstreamer,没有尝试,可以参照https://www.jianshu.com/p/7863404c1909.

Ubuntu下面的编译,依赖也挺多的,在Ubuntu下面编译源代码,可以修改源代码增加打印输出观察现象,Windows和Ubuntu相互配置。

在C语言中,使用GStreamer 1.0库的`uridecodebin`元素来播放本地视频涉及到创建一个GStreamer管道,该管道会从指定的URI读取视频数据,解码并显示。以下是一个简单的示例代码,展示了如何使用GStreamer库来播放本地视频文件: ```c #include <gst/gst.h> int main(int argc, char *argv[]) { GstElement *pipeline, *uridecodebin, *videoconvert, *autovideosink; GstBus *bus; GstMessage *msg; gchar *video_uri = "file:///path/to/your/video.mp4"; // 替换为你的视频文件路径 /* 初始化GStreamer */ gst_init(&argc, &argv); /* 创建新管道 */ pipeline = gst_pipeline_new("test-pipeline"); /* 创建uridecodebin元素 */ uridecodebin = gst_element_factory_make("uridecodebin", "uridecodebin"); g_object_set(G_OBJECT(uridecodebin), "uri", video_uri, NULL); /* 创建其他需要的元素 */ videoconvert = gst_element_factory_make("videoconvert", "videoconvert"); autovideosink = gst_element_factory_make("autovideosink", "autovideosink"); /* 将uridecodebin的视频输出链接到videoconvert */ g_object_set(G_OBJECT(uridecodebin), "video-sink", videoconvert, NULL); /* 将videoconvert的输出链接到autovideosink */ gst_bin_add_many(GST_BIN(pipeline), uridecodebin, videoconvert, autovideosink, NULL); if (gst_element_link_many(uridecodebin, videoconvert, autovideosink, NULL) != TRUE) { g_printerr("Elements could not be linked.\n"); gst_object_unref(GST_OBJECT(pipeline)); return -1; } /* 将uridecodebin添加到管道 */ gst_bin_add(GST_BIN(pipeline), uridecodebin); /* 设置播放状态 */ g_print("Now set pipeline to playing and activate ghost pads\n"); gst_element_set_state(pipeline, GST_STATE_PLAYING); /* 运行消息循环,等待消息 */ bus = gst_element_get_bus(pipeline); do { msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS); /* 检查消息类型 */ if (msg != NULL) { GError *err; gchar *debug_info; /* 处理错误消息 */ switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ERROR: gst_message_parse_error(msg, &err, &debug_info); g_printerr("Error received from element %s: %s\n", GST_OBJECT_NAME(msg->src), err->message); g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none"); g_clear_error(&err); g_free(debug_info); gst_element_set_state(pipeline, GST_STATE_NULL); break; case GST_MESSAGE_EOS: g_print("End-Of-Stream reached.\n"); break; case GST_MESSAGE_STATE_CHANGED: /* 消息可以被忽略 */ break; default: /* 不知道如何处理的其他消息 */ break; } gst_message_unref(msg); } } while (msg != NULL); /* 清理 */ gst_object_unref(GST_OBJECT(bus)); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline)); return 0; } ``` 在运行此代码之前,请确保已经安装了GStreamer库,并且在编译时链接了正确的GStreamer插件。以下是一个编译示例(假设你的源代码文件名为`play_video.c`): ```bash gcc play_video.c -o play_video $(pkg-config --cflags --libs gstreamer-1.0) ``` 请替换`/path/to/your/video.mp4`为你的视频文件路径。程序会创建一个播放本地视频文件的GStreamer管道,并且在终端输出相应的调试信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值