当前位置: 首页 > news >正文

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

文章目录

  • 1 下载,安装,配置,gStreamer
  • 2 配置 Visual Studio 项目 配置
  • 3 项目源代码
  • 4 硬解码 加速
    • 4.1 为什么 GPU 解码更流畅?
    • 4.2 如何确认是否使用 GPU?
    • 4.3 GPU 硬解码加速 代码 尝试

现在有一个无线摄像头中插入了一个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);// 初始化GStreamergst_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);  // 获取BusGstMessage* 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

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

http://www.dtcms.com/a/312432.html

相关文章:

  • LLM - 智能体工作流设计模式
  • C++ 设计模式综合实例
  • 设计原则和设计模式
  • 浅窥Claude-Prompting for Agents的Talk
  • Go语法:闭包
  • AD方案(OpenLDAP或微软AD)适配信创存在的不足以及可能优化方案
  • 风光储综合能源系统双层优化规划设计【MATLAB模型实现】
  • Android 之 WebView与HTML交互
  • ticdc同步集群部署
  • Java ++i 与 i++ 底层原理
  • 六、Linux核心服务与包管理
  • Unity_数据持久化_IXmlSerializable接口
  • java:判断两个实例(对象)相等
  • 多向量检索:lanchain,dashvector,milvus,vestorsearch,MUVERA
  • RabbitMQ面试精讲 Day 9:优先级队列与惰性队列
  • SQL154 插入记录(一)
  • 十八、Javaweb-day18-前端实战-登录
  • JavaScript 性能优化实战指南:从运行时到用户体验的全面提升​
  • 【openlayers框架学习】十:openlayers中控件的使用
  • 学习笔记《区块链技术与应用》第六天 问答 匿名技术 零知识证明
  • Apple基础(Xcode④-Flutter-Platform Channels)
  • Stream 过滤后修改元素,却意外修改原列表
  • Swift 运算符
  • 【Django】-9- 单元测试和集成测试(上)
  • Android 之 蓝牙通信(4.0 BLE)
  • Redis+Lua的分布式限流器
  • C++编译过程与GDB调试段错误和死锁问题
  • 北邮:LLM强化学习架构Graph-R1
  • C++-二叉树OJ题
  • 【反转字符串中的单词】