linux+QT5+openCV :出现GLib-GObject-WARNING,GLib-GObject-CRITICAL 错误

项目场景:

提示:这里简述项目相关背景:

树莓派/linux QT5 使用openCV库 生成应用程序是 出现GLib-GObject-WARNING,以及GLib-GObject-CRITICAL 错误。。。。折腾了一晚上心累

问题描述

提示:这里描述项目中遇到的问题:
在这里插入图片描述
(test1:3364): GLib-GObject-WARNING **: 23:57:44.713: cannot register existing type ‘GtkWidget’

(test1:3364): GLib-GObject-CRITICAL **: 23:57:44.713: g_type_add_interface_static: assertion ‘G_TYPE_IS_INSTANTIATABLE (instance_type)’ failed

(test1:3364): GLib-GObject-WARNING **: 23:57:44.714: cannot register existing type ‘GtkBuildable’

(test1:3364): GLib-GObject-CRITICAL **: 23:57:44.714: g_type_interface_add_prerequisite: assertion ‘G_TYPE_IS_INTERFACE (interface_type)’ failed

(test1:3364): GLib-CRITICAL **: 23:57:44.714: g_once_init_leave: assertion ‘result != 0’ failed</

### 回答1: 以下是使用NVIDIA的GStreamer库和OpenCV库,通过打开摄像头并将其推流为RTSP的C ++代码示例: ```c++ #include <gst/gst.h> #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char *argv[]) { GstElement *pipeline, *source, *filter, *encoder, *payloader, *sink; GstCaps *caps; GstBus *bus; GstMessage *msg; GstStateChangeReturn ret; CvCapture *cap; // Initialize GStreamer gst_init(&argc, &argv); // Create elements source = gst_element_factory_make("v4l2src", "source"); filter = gst_element_factory_make("capsfilter", "filter"); encoder = gst_element_factory_make("omxh264enc", "encoder"); payloader = gst_element_factory_make("rtph264pay", "payloader"); sink = gst_element_factory_make("udpsink", "sink"); // Create empty pipeline pipeline = gst_pipeline_new("camera-pipeline"); if (!pipeline || !source || !filter || !encoder || !payloader || !sink) { g_printerr("Not all elements could be created.\n"); return -1; } // Build pipeline caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "YUY2", "width", G_TYPE_INT, 640, "height", G_TYPE_INT, 480, "framerate", GST_TYPE_FRACTION, 30, 1, NULL); gst_bin_add_many(GST_BIN(pipeline), source, filter, encoder, payloader, sink, NULL); if (!gst_element_link_filtered(source, filter, caps)) { g_printerr("Failed to link elements.\n"); return -2; } if (!gst_element_link_many(encoder, payloader, sink, NULL)) { g_printerr("Failed to link elements.\n"); return -3; } // Set up udp sink g_object_set(sink, "host", "127.0.0.1", "port", 1234, NULL); // Set pipeline to playing state g_print("Starting camera...\n"); ret = gst_element_set_state(pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr("Unable to set pipeline to playing state.\n"); gst_object_unref(pipeline); return -4; } // Open the camera cap = cvCreateCameraCapture(0); if (!cap) { g_printerr("Failed to open camera.\n"); return -5; } // Capture and push frames while (true) { Mat frame; GstBuffer *buffer; GstFlowReturn ret; frame = cvQueryFrame(cap); if (frame.empty()) { g_print("End of stream.\n"); break; } buffer = gst_buffer_new_wrapped(frame.data, frame.total() * frame.elemSize(), 0, frame.total() * frame.elemSize()); ret = gst_app_sink_push_buffer(GST_APP_SINK(sink), buffer); if (ret != GST_FLOW_OK) { g_printerr("Failed to push buffer to sink.\n"); break; } waitKey(1); } // Clean up cvReleaseCapture(&cap); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object ### 回答2: 要实现NVIDIA打开摄像头推流RTSP的代码,可以使用GStreamer以及NVIDIA的多媒体API。 首先,在代码中引入所需的库文件,包括GStreamer和NVIDIA的多媒体API。 ```cpp #include <gst/gst.h> #include <glib.h> #include <nvbuf_utils.h> ``` 然后,设置GStreamer的环境,包括初始化和创建全局主循环。 ```cpp int main(int argc, char *argv[]) { gst_init(&argc, &argv); GMainLoop *loop = g_main_loop_new(NULL, FALSE); ``` 接下来,创建GStreamer的pipeline并添加所需的元素。 ```cpp GstElement *pipeline = gst_pipeline_new("camera-pipeline"); GstElement *source = gst_element_factory_make("v4l2src", "camera-source"); GstElement *convert = gst_element_factory_make("nvvidconv", "convert"); GstElement *encode = gst_element_factory_make("omxh264enc", "encoder"); GstElement *payloader = gst_element_factory_make("rtph264pay", "payloader"); GstElement *sink = gst_element_factory_make("udpsink", "stream-sink"); if (!pipeline || !source || !convert || !encode || !payloader || !sink) { g_printerr("Not all elements could be created."); return -1; } gst_bin_add_many(GST_BIN(pipeline), source, convert, encode, payloader, sink, NULL); ``` 然后,设置元素的参数。 ```cpp g_object_set(G_OBJECT(source), "device", "/dev/video0", NULL); g_object_set(G_OBJECT(sink), "host", "127.0.0.1", "port", 8554, NULL); ``` 接着,链接各个元素。 ```cpp if (!gst_element_link_many(source, convert, encode, payloader, sink, NULL)) { g_printerr("Elements could not be linked."); gst_object_unref(pipeline); return -1; } ``` 最后,启动pipeline并进入主循环。 ```cpp gst_element_set_state(pipeline, GST_STATE_PLAYING); g_print("Streaming started.\n"); g_main_loop_run(loop); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return 0; } ``` 这样,使用上述代码,就可以实现NVIDIA打开摄像头并推流RTSP的功能。需要注意根据实际情况设置摄像头设备的路径,以及RTSP的接收地址和端口号。 ### 回答3: 以下是一个使用NVIDIA的GStreamer工具箱实现摄像头推流RTSP的代码示例: ```python import gi gi.require_version('Gst', '1.0') from gi.repository import Gst, GObject def on_pad_added(element, pad): string_pad = pad.query_caps(None).to_string() if string_pad.startswith("video/x-raw"): convert_link = element.get_static_pad("sink") pad.link(convert_link) def main(): GObject.threads_init() Gst.init(None) pipeline_description = """ v4l2src device=/dev/video0 ! videoconvert ! video/x-raw,format=I420,width=640,height=480,framerate=30/1 ! \ tee name=t ! queue ! nvvidconv ! video/x-raw(memory:NVMM),format=I420 ! nvv4l2h264enc ! video/x-h264,stream-format=byte-stream ! \ rtspclientsink name=rtsp_sink """ pipeline = Gst.parse_launch(pipeline_description) tee = pipeline.get_by_name("t") tee.connect("pad-added", on_pad_added) rtsp_sink = pipeline.get_by_name("rtsp_sink") rtsp_sink.set_property("location", "rtsp://<your_rtsp_server_ip>:<rtsp_port>/<stream_name>") pipeline.set_state(Gst.State.PLAYING) bus = pipeline.get_bus() msg = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.ERROR | Gst.MessageType.EOS) if msg.type == Gst.MessageType.ERROR: error, debug = msg.parse_error() print(f"Error received from element {msg.src}: {error.message}") print(f"Debugging information: {debug}") elif msg.type == Gst.MessageType.EOS: print("End-of-stream reached.") pipeline.set_state(Gst.State.NULL) if __name__ == '__main__': main() ``` 要使此代码正常工作,您需要安装GStreamer和相应的插件,以及NVIDIA相关驱动程序。您还可以根据需要调整摄像头设备的参数,例如分辨率和帧率。确保将`<your_rtsp_server_ip>`更改为实际的RTSP服务器IP地址,`<rtsp_port>`更改为RTSP服务器端口号,`<stream_name>`更改为要用于流的名称。 请注意,此代码示例仅提供了一个基本的实现框架,您可能需要根据实际需求进行进一步的修改和增强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值