【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
下图表明,插件连接配置正确