[Gtk] layout.ui
播放器layout:
#
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="main_window">
<property name="title">GTK Video Player</property>
<property name="default-width">1200</property>
<property name="default-height">600</property>
<child>
<object class="GtkBox" id="main_hbox">
<property name="orientation">horizontal</property>
<property name="spacing">5</property>
<!-- Left Sidebar -->
<child>
<object class="GtkBox" id="sidebar">
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<property name="width-request">150</property> <!-- Fixed width of sidebar -->
<!-- Add 10 Buttons to the sidebar -->
<child>
<object class="GtkButton" id="button_1">
<property name="label">Button 1</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_2">
<property name="label">Button 2</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_3">
<property name="label">Button 3</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_4">
<property name="label">Button 4</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_5">
<property name="label">Button 5</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_6">
<property name="label">Button 6</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_7">
<property name="label">Button 7</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_8">
<property name="label">Button 8</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_9">
<property name="label">Button 9</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_10">
<property name="label">Button 10</property>
</object>
</child>
</object>
</child>
<!-- Center Video Area -->
<child>
<object class="GtkDrawingArea" id="video_area">
<property name="hexpand">true</property>
<property name="vexpand">true</property>
</object>
</child>
<!-- Right Text Output Area -->
<child>
<object class="GtkTextView" id="text_view">
<property name="width-request">300</property> <!-- Fixed width for text output -->
<property name="hexpand">false</property>
<property name="vexpand">true</property>
</object>
</child>
</object>
</child>
</object>
</interface>
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/video/videooverlay.h>
static GstElement *pipeline;
static void realize_cb(GtkWidget *widget, gpointer data) {
GdkWindow *window = gtk_widget_get_window(widget);
guintptr window_handle = GDK_WINDOW_XID(window);
GstVideoOverlay *overlay = GST_VIDEO_OVERLAY(pipeline);
gst_video_overlay_set_window_handle(overlay, window_handle);
}
static void activate(GtkApplication *app, gpointer user_data) {
GtkBuilder *builder = gtk_builder_new();
gtk_builder_add_from_file(builder, "layout.ui", NULL);
GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
GtkWidget *drawing_area = GTK_WIDGET(gtk_builder_get_object(builder, "video_area"));
g_signal_connect(drawing_area, "realize", G_CALLBACK(realize_cb), NULL);
gtk_widget_show_all(window);
// 创建 GStreamer 管道并播放视频
pipeline = gst_parse_launch("playbin uri=file:///path/to/video", NULL);
GstVideoOverlay *overlay = GST_VIDEO_OVERLAY(pipeline);
gst_video_overlay_set_window_handle(overlay, GDK_WINDOW_XID(gtk_widget_get_window(drawing_area)));
gst_element_set_state(pipeline, GST_STATE_PLAYING);
}
int main(int argc, char **argv) {
GtkApplication *app;
int status;
gst_init(&argc, &argv);
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
g_object_unref(app);
return status;
}
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="main_window">
<property name="title">GTK Video Player</property>
<property name="default-width">1200</property>
<property name="default-height">600</property>
<child>
<object class="GtkBox" id="main_hbox">
<property name="orientation">horizontal</property>
<property name="spacing">5</property>
<!-- Left Sidebar with scrollable content -->
<child>
<object class="GtkScrolledWindow" id="scrolled_sidebar">
<property name="width-request">150</property>
<property name="hscrollbar-policy">never</property>
<property name="vscrollbar-policy">automatic</property>
<child>
<object class="GtkViewport">
<child>
<object class="GtkBox" id="sidebar">
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<!-- Add 10 Buttons to the sidebar -->
<child>
<object class="GtkButton" id="button_1">
<property name="label">Button 1</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_2">
<property name="label">Button 2</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_3">
<property name="label">Button 3</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_4">
<property name="label">Button 4</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_5">
<property name="label">Button 5</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_6">
<property name="label">Button 6</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_7">
<property name="label">Button 7</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_8">
<property name="label">Button 8</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_9">
<property name="label">Button 9</property>
</object>
</child>
<child>
<object class="GtkButton" id="button_10">
<property name="label">Button 10</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<!-- Separator between sidebar and drawing area -->
<child>
<object class="GtkSeparator" id="separator">
<property name="orientation">vertical</property>
</object>
</child>
<!-- Center Video Area -->
<child>
<object class="GtkDrawingArea" id="video_area">
<property name="hexpand">true</property>
<property name="vexpand">true</property>
</object>
</child>
<!-- Right Text Output Area -->
<child>
<object class="GtkTextView" id="text_view">
<property name="width-request">300</property>
<property name="hexpand">false</property>
<property name="vexpand">true</property>
</object>
</child>
</object>
</child>
</object>
</interface>
相关文章:
[Gtk] layout.ui
播放器layout: # <?xml version"1.0" encoding"UTF-8"?> <!-- Generated with glade 3.38.2 --> <interface> <requires lib"gtk" version"3.20"/> <object class"GtkWindow"…...

Spring MVC:精通JSON数据返回的几种高效方式
前言 在实际开发中,我们在前后端传送数据通常使用Json格式,而在Spring MVC中返回Json格式的方式有多种,接下来我将介绍其中一些。 准备工作 为了演示Json格式的数据,我们准备一个实体类,例如User,这些可以测…...
[LeetCode 题3] 没有重复字符的最长的子字符串
问题描述 输入:一个字符串 s。输出:最长的无重复字符的子串的长度。 示例 输入: s "abcabcbb" 输出: 3 解释: 最长的无重复字符的子串是 "abc",长度为 3。 输入: s "bbbbb" 输出: 1 解释: 最长的无重复字…...
YoloDotNet 在工业检测中的应用详解
文章目录 一、数据收集与标注二、模型选择与训练三、检测流程设计四、结果评估与优化五、与工业生产线集成一、数据收集与标注 在工业检测中,首先需要收集大量的相关工业产品图像数据。这些数据应涵盖不同的产品类型、缺陷种类以及各种可能的生产状态。例如,对于电子产品的检…...

DataFrame增删改数据
目录 准备数据 DataFrame添加列 直接添加列数据 使用insert添加列数据 DataFrame删除行列 准备数据 删除行 删除列 DataFrame数据去重 准备数据 import pandas as pd df pd.read_csv("../data/b_LJdata.csv") df DataFrame添加列 直接添加列数据 1&…...

一站式解决App下载量统计,Xinstall引领新潮流
在移动应用市场中,App下载量是衡量应用受欢迎程度和市场表现的重要指标。然而,对于许多开发者而言,如何精准统计App下载量却是一个不小的挑战。幸运的是,如今有了一款专业的App全渠道统计服务商——Xinstall,它能够帮助…...
ijkMediaPlayer+ TextureView 等比全屏播放视频(避免拉伸)
TextureView默认以fitxy的方式加载surface数据,如果需要等比全屏播放视频,避免拉伸,可以采用Matrix对TextureView进行变换 废话不多说,直接上代码 public class BaseIjkPlayer implements TextureView.SurfaceTextureListener{/…...
【RS】GEE(Python):数据处理
在前面的章节中,我们已经学习了如何加载影像数据。现在,让我们进一步探讨如何在 Google Earth Engine (GEE) 中进行数据处理。数据处理通常包括图像预处理、裁剪、过滤、重采样等操作。 栅格影像的处理 栅格影像处理包括了裁剪、波段选择、重采样、合成…...

非线性磁链观测器推导
<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> 电机方程 电压方程 磁链方程 定义状态变量和输出变量 非线性观测器方程 电角度的计算--锁相环 锁相环调参 电机…...
什么时机用mysql,什么时机用redis,什么时机用本地内存
mysql 的 buffer pool 也是存在内存中,redis 的数据也是存在内存中,为什么不直接存在 mysql 里? 1、数据结构和访问方式 Redis 是一个内存数据库,专门为高效的读写性能而设计。它支持多种数据结构(如字符串、列表、哈…...

Redis八股
缓存 缓存穿透 当查询一个不存在的数据,mysql查询不到数据,无法写入缓存,导致每次都请求数据库 解决方法 缓存空数据,当查询结果未空,将结果进行缓存。 简单但是会消耗内存,而且会出现不一致情况。布隆…...

vue3--通用 popover 气泡卡片组件实现
背景 在日常开发中,我们一般都是利用一些诸如:element-ui、element-plus、ant-design等组件库去做我们的页面或者系统 这些对于一些后台管理系统来说是最好的选择,因为后台管理系统其实都是大同小异的,包括功能、布局结构等 但是对于前台项目,比如官网、门户网站这些 …...

Bluetooth Channel Sounding中关于CS Step及Phase Based Ranging相应Mode介绍
目录 BLE CS中Step定义 BLE CS中交互的数据包/波形格式 BLE CS中Step的不同Mode BLE CS中Step的执行过程 Mode0介绍 Mode0 步骤的作用 Mode0步骤的执行过程 Mode0步骤的执行时间 Mode0步骤的时间精度要求 Mode2介绍 Mode2步骤的作用和执行过程 Mode2步骤的执行时间 B…...
简易STL实现 | Queue 的实现
封装: std::queue 在底层容器的基础上 提供了封装。默认情况下,std::queue 使用 std::deque 作为其底层容器,但也可以配置为使用 std::list 或 其他符合要求的容器 时间复杂度: 入队和出队操作 通常是 常数时间复杂度(…...

【hot100-java】LRU 缓存
链表篇 灵神题解 class LRUCache {private static class Node{int key,value;Node prev,next;Node (int k,int v){keyk;valuev;}}private final int capacity;//哨兵节点private final Node dummynew Node(0,0);private final Map<Integer,Node> keyToNode new HashMap&l…...

Centos7安装ZLMediaKit
一 获取代码 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init git submodule update --init 命令用于初始化和更新 Git 仓库中的子模块(submodules)。这个命令在 Git 仓库中包含对其他 Git 仓库作为依赖时…...

面试问我LLM中的RAG,咱就是说秒过!!!
前言 本篇文章涉及了 RAG 流程中的数据拆分、向量化、查询重写、查询路由等等,在做 RAG 的小伙伴一定知道这些技巧的重要性。推荐仔细阅读,建议收藏,多读几遍,好好实践。 本文是对检索增强生成(Retrieval Augmented …...
python程序操作pdf
python代码进行多个图片合并为pdf: #python代码进行多个图片合并为pdf: from PIL import Image from fpdf import FPDF import osdef images_to_pdf(image_paths, output_pdf, quality85):"""将多个图片合并为一个PDF文件,并…...

【Python报错】ImportError: DLL load failed while importing _network: 找不到指定的模块。
【Python报错】ImportError: DLL load failed while importing _network: 找不到指定的模块。 问题描述报错原因解决方案参考 问题描述 此段Python代码(在Conda环境下运行)昨天还能运行,但在我手痒更新conda(我有罪)之…...

外包干了5天,技术明显退步
我是一名本科生,自2019年起,我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定,但日复一日的重复性工作让我逐渐陷入了舒适区,失去了前进的动力。两年的时光匆匆流逝,我却在原地踏步,技术没有丝毫…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...