【gStreamer】Windows VS2022 C++ 项目中调用gstreamer相关函数,获取无线摄像头视频

发布于:2025-08-04 ⋅ 阅读:(12) ⋅ 点赞:(0)

现在有一个无线摄像头中插入了一个SD卡,SD卡中是wifi信息“

# 用于WiFi 2.4G连接测试、WiFi出图测试 
wifi_ssid=TP-test123
wifi_passwd=88888888

# 用于WiFi出图测试
ip=192.168.31.221 #
autoircut=1 #”。

外部硬件链接描述:电脑和路由器之间一根网线连接,生成无线网TP-0510-test。然后电脑上就可以看到无线摄像头的实时画面了。

电脑端可以在输入CMD命令打开无线摄像头实时画面,命令“gst-launch-1.0 rtspsrc location=rtsp://192.168.31.221:554/main_stream latency=0 ! decodebin ! videoconvert ! autovideosink”。

现在,怎么在 Windows VS2022 C++ 项目中调用gstreamer相关函数,获取无线摄像头视频。

1 下载,安装,配置,gStreamer

2 配置 Visual Studio 项目 配置

需要在VS2022项目中添加 GStreamer 库的 附加依赖项

gstreamer-1.0.lib
gobject-2.0.lib
glib-2.0.lib
gstbase-1.0.lib
gstapp-1.0.lib
gstvideo-1.0.lib

3 项目源代码

#include <gst/gst.h>
#include <iostream>
#include <glib.h>

int main(int argc, char* argv[])
{
    //设置日志级别为3,输出详细的调试信息
    //_putenv("GST_DEBUG=3");
    //gst_debug_set_active(TRUE);
    


    // 初始化GStreamer
    gst_init(&argc, &argv);

    // 构建GStreamer管道

    //CPU 进行解码,软解码
    const gchar* pipeline_desc = "rtspsrc location=rtsp://192.168.31.221:554/main_stream latency=0 ! decodebin ! videoconvert ! autovideosink";

    GstElement* pipeline = gst_parse_launch(pipeline_desc, NULL);

    if (!pipeline) {
        std::cerr << "Failed to create pipeline" << std::endl;
        return -1;
    }

    // 启动管道播放
    GstStateChangeReturn ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
    if (ret == GST_STATE_CHANGE_FAILURE) {
        std::cerr << "Unable to set the pipeline to the playing state." << std::endl;
        gst_object_unref(pipeline);
        return -1;
    }

    std::cout << "Pipeline is playing, press Ctrl+C to stop..." << std::endl;

    // 获取Bus并监听消息
    GstBus* bus = gst_element_get_bus(pipeline);  // 获取Bus
    GstMessage* msg = gst_bus_poll(bus, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS), GST_CLOCK_TIME_NONE);  // 监听错误或EOS消息

    if (msg != NULL) {
        GError* err;
        gchar* debug_info;

        if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR) {
            gst_message_parse_error(msg, &err, &debug_info);
            std::cerr << "Error: " << err->message << std::endl;
            std::cerr << "Debug info: " << debug_info << std::endl;
            g_error_free(err);
            g_free(debug_info);
        }
        if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_EOS) {
            std::cout << "End of stream" << std::endl;
        }

        gst_message_unref(msg);  // 释放消息
    }

    gst_object_unref(bus);  // 释放Bus


    // 清理
    gst_element_set_state(pipeline, GST_STATE_NULL);  // 停止管道
    gst_object_unref(pipeline);  // 释放管道对象

    return 0;
}

在这里插入图片描述

4 硬解码 加速

使用了NVIDIA GPU 的硬件解码器。

那么视频解码过程将会使用 GPU 资源而不是 CPU 资源。这能够显著减少 CPU 的负担,并提高视频处理效率,特别是在高分辨率或者高比特率的视频流中。

4.1 为什么 GPU 解码更流畅?

  • 并行处理: NVIDIA GPU 设计用于并行处理任务,因此它能更高效地处理视频流解码任务,尤其是像 H.264 这样高压缩比的编码格式。
  • 硬件加速: 硬解码(通过 nvh264dec)能够通过专门的硬件单元加速解码过程,这比软件解码要快得多。
    降低延迟: 硬件解码的延迟通常比 CPU 解码更低,这对于实时视频流非常重要。特别是在无线视频传输中,减少解码延迟会提高流畅度和响应速度。

4.2 如何确认是否使用 GPU?

使用 NVIDIA-smi 工具查看 GPU 使用情况: 打开命令行,输入 nvidia-smi,查看 GPU 的使用情况,特别是解码过程。

GPU 使用率为0

在这里插入图片描述

在任务管理器中查看,集显使用过了一点,独显并未使用。
在这里插入图片描述
在这里插入图片描述

4.3 GPU 硬解码加速 代码 尝试

NVIDIA 硬件解码器,GPU加速(无法播放)

 //NVIDIA 硬件解码器,GPU加速(无法播放)
 const gchar* pipeline_desc = "rtspsrc location=rtsp://192.168.31.221:554/main_stream latency=0 ! rtph264depay ! nvh264dec ! videoconvert ! autovideosink";

检查管道连接: 尝试直接使用 decodebin 来让 GStreamer 自动选择解码器,而不是直接指定硬解码器。
decodebin 会根据输入的流类型选择最佳解码器。

//还是没有使用  NVIDIA 硬件解码器
 const gchar* pipeline_desc = "rtspsrc location=rtsp://192.168.31.221:554/main_stream latency=0 ! decodebin ! videoconvert ! autovideosink";

还是不行,先检查流的类型,确保它是 H.264 流,并且 RTP 解包部分配置正确。

1. 检查元素是否正确连接
nvh264dec 插件需要有一个合适的输入格式,比如 H.264 的 RTP 流。你使用的是 rtph264depay 来解包 RTP 流,但如果 rtph264depay 或 nvh264dec 插件没有正确配置或没有正确链接,可能会导致错误。

尝试使用 gst-inspect-1.0 来检查所有插件是否正常:

gst-inspect-1.0 nvh264dec
gst-inspect-1.0 rtph264depay

下图表明,插件连接配置正确
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到