首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

QT实现播放gstreamer视频

后端 6.37KB 20 需要积分: 1
立即下载

资源介绍:

本源码为博文 《【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(); //}

资源文件列表:

QT-gstreamer-test.zip 大约有7个文件
  1. test/
  2. test/mainwindow.h 323B
  3. test/test.pro 891B
  4. test/mainwindow.cpp 221B
  5. test/test.pro.user 18.28KB
  6. test/main.cpp 6.65KB
  7. test/mainwindow.ui 988B
0评论
提交 加载更多评论
其他资源 vue登录界面,jquery插件库获取
vue登录界面,jquery插件库获取
使用jQuery库来增强HTML页面中的导航功能,结合Bootstrap、CSS和JavaScript可以创建响应式菜单
使用jQuery库来增强HTML页面中的导航功能,结合Bootstrap、CSS和JavaScript可以创建响应式且交互友好的网站菜单
编程-Python3.7-适合学习编程的朋友
压缩包内为Python3.7版本文件,附带文档手册。本版本功能完善,编程特性便捷。学习编程、不方便科学上网和网速较慢的朋友。欢迎下载使用。
编程-Python3.7-适合学习编程的朋友 编程-Python3.7-适合学习编程的朋友 编程-Python3.7-适合学习编程的朋友
易语言环境下共享图书源码
利用易语言制作的一款小说共享软件源码
2024“数智中原”河南省大学生电子设计大赛暨模拟电子系统设计专题赛选拔赛试题(1).zip
2024“数智中原”河南省大学生电子设计大赛暨模拟电子系统设计专题赛选拔赛试题(1).zip
支持JSON配置的定时启停多个游戏服务器(如Minecraft)的Linux脚本
支持JSON配置的定时启停多个游戏服务器(如Minecraft)的Linux脚本
NodeJs-v18.18.0 Linux安装包及安装脚本
NodeJs-v18.18.0 Linux安装包及安装脚本 小白适用 一键安装
xtrabackup8.0.35及依赖包
xtrabackup8.0.35及依赖包