ZIPQT实现播放gstreamer视频qq_459069726.37KB需要积分:1立即下载资源文件列表: QT-gstreamer-test.zip 大约有7个文件 test/ test/mainwindow.h 323B test/test.pro 891B test/mainwindow.cpp 221B test/test.pro.user 18.28KB test/main.cpp 6.65KB test/mainwindow.ui 988B 资源介绍: 本源码为博文 《【QGroundControl二次开发】八. QT实现播放gstreamer视频 》配套源码, 搭建gstreamer在Windows和linux下的环境,以及新建VS工程解码视频流请参阅之前博文。 博文包含: 一. QT工程配置 二. 项目代码 三. 测试 实测可运行,运行环境为Ubuntu系统+QT+Gstreamer #include #include #include #include #include #include "ui_mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); GstElement *pipeline, *udpsrc, *capsfilter, *queue, *rtph264depay, *h264parse, *avdec_h264, *videoconvert, *vsink, *fpssink; GstCaps *caps; GstStateChangeReturn ret; QWidget *window = new QWidget(); window->resize(1920, 1080); window->show(); WId xwinid = window->winId(); // 初始化 GStreamer gst_init(NULL, NULL); // 创建元素 pipeline = gst_pipeline_new("my-pipeline"); udpsrc = gst_element_factory_make("udpsrc", "udpsrc"); capsfilter = gst_element_factory_make("capsfilter", "capsfilter"); queue = gst_element_factory_make("queue", "queue"); h264parse = gst_element_factory_make("h264parse", "h264parse"); avdec_h264 = gst_element_factory_make("avdec_h264", "avdec_h264"); rtph264depay = gst_element_factory_make("rtph264depay", "rtph264depay"); videoconvert = gst_element_factory_make("videoconvert", "videoconvert"); fpssink = gst_element_factory_make("fpsdisplaysink", "fpssink"); vsink = gst_element_factory_make("xvimagesink", "vsink");//glimagesink if (!pipeline || !udpsrc || !capsfilter || !queue || !rtph264depay || !h264parse || !avdec_h264 || !videoconvert || !fpssink || !vsink) { g_printerr("Failed to create elements. Exiting.\n0000000"); return -1; } // 设置 udpsrc 元素的参数 g_object_set(udpsrc, "port", 14556, NULL); // 创建 caps "depth", G_TYPE_STRING, "8", /* "width", G_TYPE_STRING, "1920", "height", G_TYPE_STRING, "1080",*/ caps = gst_caps_new_simple("application/x-rtp", "media", G_TYPE_STRING, "video", "clock-rate", G_TYPE_INT, 90000, "encoding-name", G_TYPE_STRING, "H264", NULL); g_object_set(capsfilter, "caps", caps, NULL); gst_caps_unref(caps); // g_object_set (fpssink, "video-sink", vsink, NULL); // 将元素添加到管道中 gst_bin_add_many(GST_BIN(pipeline), udpsrc, capsfilter, queue, rtph264depay, h264parse, avdec_h264, videoconvert, vsink, NULL); // 连接元素 if (!gst_element_link_many(udpsrc, capsfilter, queue, rtph264depay, h264parse, avdec_h264, videoconvert, vsink, NULL)) { g_printerr("Failed to link elements. Exiting.\n11111111111"); gst_object_unref(pipeline); return -1; } // 连接元素 // if (!gst_element_link(udpsrc, capsfilter)) { // g_printerr("Failed to link udpsrc and capsfilter. Exiting.\n"); // gst_object_unref(pipeline); // return -1; // } // if (!gst_element_link(capsfilter, queue)) { // g_printerr("Failed to link capsfilter and queue. Exiting.\n"); // gst_object_unref(pipeline); // return -1; // } // if (!gst_element_link(queue, rtph264depay)) { // g_printerr("Failed to link queue and rtph264depay. Exiting.\n"); // gst_object_unref(pipeline); // return -1; // } // if (!gst_element_link(rtph264depay, h264parse)) { // g_printerr("Failed to link rtph264depay, h264parse. Exiting.\n"); // gst_object_unref(pipeline); // return -1; // } // if (!gst_element_link(h264parse, avdec_h264)) { // g_printerr("Failed to link qh264parse, avdec_h264. Exiting.\n"); // gst_object_unref(pipeline); // return -1; // } // if (!gst_element_link(avdec_h264, videoconvert)) { // g_printerr("Failed to link avdec_h264, videoconvert. Exiting.\n"); // gst_object_unref(pipeline); // return -1; // } // if (!gst_element_link(videoconvert, vsink)) { // g_printerr("Failed to link avideoconvert, vsink. Exiting.\n"); // gst_object_unref(pipeline); // return -1; // } // 链接QT界面 gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (vsink), xwinid); // 设置管道状态为播放 ret = gst_element_set_state(pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr("Failed to set pipeline state to PLAYING. Exiting.\n"); gst_object_unref(pipeline); return -1; } auto res = a.exec(); // 释放资源 gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return res; } //#include //#include //#include //#include //#include //#include //#include //#include //class MainWindow : public QWidget { // Q_OBJECT //public: // MainWindow() { // QVBoxLayout *layout = new QVBoxLayout(this); // videoDisplay = new QWidget(this); // layout->addWidget(videoDisplay); // // 初始化 GStreamer // gst_init(nullptr, nullptr); // // 创建 GStreamer 管道 // pipeline = gst_parse_launch("appsrc name=source is-live=True ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink",NULL); // // 配置 appsrc // appsrc = GST_ELEMENT(gst_bin_get_by_name(GST_BIN(pipeline), "source")); // g_object_set(appsrc, "format", GST_FORMAT_TIME, "stream-type", 0, nullptr); // // 启动 GStreamer 管道 // gst_element_set_state(pipeline, GST_STATE_PLAYING); // // 初始化并启动 QUdpSocket 来接收数据 // udpSocket = new QUdpSocket(this); // udpSocket->bind(QHostAddress::Any, 14556); // connect(udpSocket, &QUdpSocket::readyRead, this, &MainWindow::processPendingDatagrams); // } //private slots: // void processPendingDatagrams() { // while (udpSocket->hasPendingDatagrams()) { // QByteArray datagram; // datagram.resize(udpSocket->pendingDatagramSize()); // QHostAddress sender; // quint16 senderPort; // udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); // // 将接收到的数据提供给 GStreamer // GstBuffer *buffer = gst_buffer_new_allocate(nullptr, datagram.size(), nullptr); // gst_buffer_fill(buffer, 0, datagram.data(), datagram.size()); // gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer); // } // } //private: // GstElement *pipeline; // GstElement *appsrc; // QUdpSocket *udpSocket; // QWidget *videoDisplay; //}; //#include "main.moc" // 确保包含 moc 文件 //int main(int argc, char *argv[]) { // QApplication app(argc, argv); // MainWindow mainWindow; // mainWindow.show(); // return app.exec(); //}