文章目录
- [1 下载,安装,配置,gStreamer](#1 下载,安装,配置,gStreamer)
- [2 配置 Visual Studio 项目 配置](#2 配置 Visual Studio 项目 配置)
- [3 项目源代码](#3 项目源代码)
- [4 硬解码 加速](#4 硬解码 加速)
-
- [4.1 为什么 GPU 解码更流畅?](#4.1 为什么 GPU 解码更流畅?)
- [4.2 如何确认是否使用 GPU?](#4.2 如何确认是否使用 GPU?)
- [4.3 GPU 硬解码加速 代码 尝试](#4.3 GPU 硬解码加速 代码 尝试)
现在有一个无线摄像头中插入了一个SD卡,SD卡中是wifi信息"
csharp
# 用于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 库的 附加依赖项:
csharp
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 项目源代码
csharp
#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加速(无法播放)
csharp
//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 会根据输入的流类型选择最佳解码器。
csharp
//还是没有使用 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 来检查所有插件是否正常:
csharp
gst-inspect-1.0 nvh264dec
gst-inspect-1.0 rtph264depay
下图表明,插件连接配置正确