GStreamer —— 2.17、Windows下Qt加载GStreamer库后运行 - “播放教程 5:色彩平衡“(附:完整源码)
运行效果

介绍
亮度、对比度、色相和饱和度是常见的视频调整, 在 GStreamer 中统称为 Color Balance 设置。 本教程展示了:
• 如何找出可用的色彩平衡通道
• 如何更改它们
允许访问颜色平衡设置。如果 元素支持这个接口,只需将其转发给应用程序,否则会有一个 colorbalance 元素插入到管道中。
GStreamer相关运行库
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0/gst
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/gstreamer-1.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/include/glib-2.0
INCLUDEPATH += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0/includeLIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gstreamer-1.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/glib-2.0.lib
LIBS += D:/Software/GStreamer/1.0/mingw_x86_64/lib/gobject-2.0.lib
源码
#include <string.h>
#include <stdio.h>
#include <gst/gst.h>
#include <gst/video/colorbalance.h>typedef struct _CustomData
{GstElement *pipeline;GMainLoop *loop;
} CustomData;/* 处理色彩平衡命令 */
static void update_color_channel (const gchar *channel_name, gboolean increase, GstColorBalance *cb)
{GstColorBalanceChannel *channel = NULL;/* 检索频道列表并找到所请求的频道 */const GList *channels = gst_color_balance_list_channels (cb);for (const GList *l = channels; l != NULL; l = l->next){GstColorBalanceChannel *tmp = (GstColorBalanceChannel *)l->data;if (g_strrstr (tmp->label, channel_name)){channel = tmp;break;}}if (!channel){return;}/* 更改通道值 */gdouble step = 0.1 * (channel->max_value - channel->min_value);gint value = gst_color_balance_get_value (cb, channel);if (increase){value = (gint)(value + step);if (value > channel->max_value)value = channel->max_value;}else{value = (gint)(value - step);if (value < channel->min_value)value = channel->min_value;}gst_color_balance_set_value (cb, channel, value);
}/* Output the current values of all Color Balance channels */
static void print_current_values (GstElement *pipeline)
{/* 输出所有色彩平衡通道的当前值 */const GList *channels = gst_color_balance_list_channels (GST_COLOR_BALANCE (pipeline));for (const GList *l = channels; l != NULL; l = l->next){GstColorBalanceChannel *channel = (GstColorBalanceChannel *)l->data;gint value = gst_color_balance_get_value (GST_COLOR_BALANCE (pipeline), channel);g_print ("%s: %3d%% ", channel->label, 100 * (value - channel->min_value) / (channel->max_value - channel->min_value));}g_print ("\n");
}/* 处理键盘输入 */
static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data)
{gchar *str = NULL;if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) { return TRUE; }switch (g_ascii_tolower (str[0])){case 'c':update_color_channel ("CONTRAST", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));break;case 'b':update_color_channel ("BRIGHTNESS", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));break;case 'h':update_color_channel ("HUE", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));break;case 's':update_color_channel ("SATURATION", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));break;case 'q':g_main_loop_quit (data->loop);break;default:break;}g_free (str);print_current_values (data->pipeline);return TRUE;
}int main(int argc, char *argv[])
{/* 初始化GStreamer */gst_init (&argc, &argv);/* 初始化数据结构 */CustomData data;memset (&data, 0, sizeof (data));/* 打印按键功能 */g_print ("USAGE: Choose one of the following options, then press enter:\n"" 'C' to increase contrast, 'c' to decrease contrast\n"" 'B' to increase brightness, 'b' to decrease brightness\n"" 'H' to increase hue, 'h' to decrease hue\n"" 'S' to increase saturation, 's' to decrease saturation\n"" 'Q' to quit\n");/* 构建管道 */data.pipeline = gst_parse_launch ("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm", NULL);/* 添加键盘监视器,以便我们收到按键通知 */
#ifdef G_OS_WIN32GIOChannel *io_stdin = g_io_channel_win32_new_fd (fileno (stdin));
#elseGIOChannel *io_stdin = g_io_channel_unix_new (fileno (stdin));
#endifg_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);/* 开始播放 */GstStateChangeReturn ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);if (ret == GST_STATE_CHANGE_FAILURE){g_printerr ("Unable to set the pipeline to the playing state.\n");gst_object_unref (data.pipeline);return -1;}print_current_values (data.pipeline);/* 创建GLib主循环 */data.loop = g_main_loop_new (NULL, FALSE);g_main_loop_run (data.loop);/* 释放资源 */g_main_loop_unref (data.loop);g_io_channel_unref (io_stdin);gst_element_set_state (data.pipeline, GST_STATE_NULL);gst_object_unref (data.pipeline);return 0;
}
关注
笔者 - jxd
相关文章:
GStreamer —— 2.17、Windows下Qt加载GStreamer库后运行 - “播放教程 5:色彩平衡“(附:完整源码)
运行效果 介绍 亮度、对比度、色相和饱和度是常见的视频调整, 在 GStreamer 中统称为 Color Balance 设置。 本教程展示了: • 如何找出可用的色彩平衡通道 • 如何更改它们 允许访问颜色平衡设置。如果 元素支持这个接口,只需将其转发给应用…...
串口通信ASCII码转16进制及C#串口编程完整源码下载
在工业自动化、嵌入式系统及物联网以行业中,串口编程非常重要。 串口编程,重点在于串口数据通信和数据处理。 在C#中,System.IO.Ports命名空间提供了SerialPort类,用于实现串口通信。 串口程序的开发主要包括以下几点 1.引用命…...
解决vscode中出现“无法将pip项识别...“问题
问题 遇见问题如下: 查看pip 通过 winR ,输入 cmd,进入终端,搜索 where pip。 发现 pip 查不出来,然后进入文件资源管理器,搜索 Scripts 文件夹,如果没有找到可能是电脑没有下载 python。 点击…...
nacos下载及安装
下载官方最新稳定版 github下载较慢,推荐下面的下载链接 Nacos Server 下载 | Nacos 官网 点击下载和试用下载最新稳定版 Nacos Server 下载 | Nacos 官网 配置检查(可选) 默认情况下,Nacos 使用内置的 Derby 数据库&#x…...
C++从零实现Json-Rpc框架
文章目录 一、项目介绍1. 基本原理2. 涉及到的技术栈3. 最终实现的效果 二、 第三方库的介绍与使用1. JsonCpp库Json的数据格式JsonCpp介绍封装Json工具类 2. muduo库muduo库是什么Muduo库常见接口介绍 3. C11异步操作std::future 三、框架设计1. 服务端模块划分NetworkProtoco…...
rom定制系列------小米note3 原生安卓15 批量线刷 默认开启usb功能选项 插电自启等
小米Note 3搭载骁龙660处理器,1200万像素广角镜头、俗称大号版的小米6,官方最终版为12.0.1稳定版安卓9的固件。客户需要运行在安卓15的rom。根据原生官网的rom修改一些功能选项。以便客户操作需求。 定制资源说明 根据客户需求采用安卓15原生系统为底包…...
使用jest测试用例之入门篇
Jest使用 Jest 是由 Facebook 开发的一个 js 测试框架,jest 主要侧重于被用于做单元测试和集成测试 安装 npm i jest -D运行 **package.json**里面配置命令 // scripts添加测试脚本 {"test": "jest" /* 运行后便会使用 jest 执行所有的 .t…...
大数据学习(59)-DataX执行机制
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
YashanDB认证,YCA证书认证教程,免费证书,内含真题考试题库及答案——五分钟速成
目录 一.账号及平台注册登录流程 二.登录进行设备调试核验 三.考试(考完获取分数) 四.获取证书 五.题库及答案 一.账号及平台注册登录流程 1-点击这里进行账号注册(首次学习必须先注册,有账号之后可以直接在2号链接登录&#…...
消防行业如何借助 TDengine 打造高效的数据监控与分析系统
小T导读:本篇文章来自“2024,我想和 TDengine 谈谈”征文活动的优秀投稿,深入探讨了如何在消防行业中运用 TDengine 进行业务建模。文章重点介绍了如何通过 TDengine 的超级表、标签设计和高效查询功能,有效管理消防监控系统中的时…...
自然语言处理中的语音识别技术:从声波到语义的智能解码
引言 语音识别(Automatic Speech Recognition, ASR)是自然语言处理(NLP)的关键分支,旨在将人类语音信号转化为可处理的文本信息。随着深度学习技术的突破,语音识别已从实验室走向日常生活,赋能…...
010-Catch2
Catch2 一、框架简介 Catch2 是一个基于 C 的现代化单元测试框架,支持 TDD(测试驱动开发)和 BDD(行为驱动开发)模式。其核心优势在于: 单头文件设计:v2.x 版本仅需包含 catch.hpp 即可使用自然…...
TypeScript类:面向对象编程的基石
一、从现实世界到代码世界 想象你要建造一栋房子,首先需要一张设计蓝图——它定义了房屋的结构(几个房间)、功能(卧室/厨房)和特性(材料/颜色)。在TypeScript中,class就是这个设计蓝…...
Bad owner or permissions on ssh/config - 解决方案
问题 在Windows系统通过ssh连接远程服务器时报错: ssh [ssh_user][ip] Bad owner or permissions on C:\\Users\\[win_user]/.ssh/config原因 这是因为.ssh文件夹或.ssh/config文件的权限异常,当前Windows账号没有读写权限导致的。 Windows系统重装&a…...
C++之序列容器(vector,list,dueqe)
1.大体对比 在软件开发的漫长历程中,数据结构与算法始终占据着核心地位,犹如大厦的基石,稳固支撑着整个程序的运行。在众多编程语言中,数据的存储与管理方式各有千秋,而 C 凭借其丰富且强大的工具集脱颖而出ÿ…...
安卓Android与iOS设备管理对比:企业选择指南
目录 一、管理方式差异 Android Enterprise方案包含三种典型模式: Apple MDM方案主要提供两种模式: 二、安全防护能力 Android系统特点: 三、应用管理方案 四、设备选择建议 五、典型场景推荐 需求场景 推荐方案 六、决策建议要点…...
git本地仓库链接远程仓库
重命名本地分支为main 如果你希望本地分支名称与远程分支名称保持一致,可以考虑将本地的master分支重命名为main。这可以通过以下命令完成: 在连接之前要先提交 git add . git commit -m "init" 强制推送到远程 git push -f origin main 首…...
版本控制器Git(1)
文章目录 前言一、初识Git问题引入解决方案注意事项 二、Git安装三、Git配置与基本操作Git创建Git配置用户名称和地址认识工作区、暂存区、版本库添加文件到仓库添加文件到暂存区提交暂存区内容到本地仓库 查看提交历史 四、Git 暂存区、HEAD、对象库及文件Git内部结构概览查看…...
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
引言 随着大型语言模型(LLMs)在技术领域的应用日益广泛,评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力,…...
[动手学习深度学习]12.权重衰退
1.介绍 权重衰退是常见的处理过拟合的方法 控制模型容量方法 把模型控制的比较小,即里面参数比较少使参数选择范围小 约束就是正则项 每个特征的权重都大会导致模型复杂,从而导致过拟合。 控制权重矩阵范数可以使得减少一些特征的权重,甚至…...
JavaEE_多线程(二)
目录 1. 线程的状态2. 线程安全2.1 线程不安全问题的原因 3. 线程安全中的部分概念3.1 原子性3.2 可见性3.3 指令重排序 4. 解决线程安全问题4.1 synchronized关键字4.1.1 可重入4.1.2 synchronized使用 4.2 volatile关键字4.2.1 volatile使用 5. wait和notify5.1 wait()方法5.…...
【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2025年最新的方法,实测有效)
文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...
【Hadoop】详解HDFS
Hadoop 分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统,它是一个高度容错性的系统,适合部署在廉价的机器上,能够提供高吞吐量的数据访问,非常适合大规模数据集上的应用。为了做到可靠性,HDFS创建了…...
Spring(4)——响应相关
一、返回静态页面 1.1**RestController和Controller** 想返回如下页面: 如果我们依旧使用原来的**RestController** 可以看到的是仅仅返回了字符串。 此时将**RestController改为Controller** 可以看到这次返回的是html页面。 那么**RestController和Controller…...
axure11安装教程包含下载、安装、汉化、授权(附安装包)图文详细教程
文章目录 前言一、axure11安装包下载二、axure11安装教程1.启动安装程序2.安装向导界面3.安装协议协议页面2.选择安装位置3.开始安装4.完成安装 三、axure11汉化教程1.axure11汉化包2.axure11汉化设置 四、axure11授权教程1.打开axure112.设置使用方式3.输入许可证号4.axure11安…...
如何注册海外社媒平台账号
在数字贸易时代,社媒平台已成为外贸企业触达全球客户的战略要地。数据显示,2023年全球B2B采购决策者中,87%通过社媒渠道完成供应商初筛。本文深度解析主流平台的运营规则与技术方案,构建覆盖获客转化全链路的数字化营销体系。 一…...
Python IO编程-序列化
目录 JSON JSON进阶 练习 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d dict(nameBob, age20, score88)可以随时修改变量,比如把name改成Bill,但是一旦程序结束,变量所…...
Redis-缓存穿透击穿雪崩
1. 穿透问题 缓存穿透问题就是查询不存在的数据。在缓存穿透中,先查缓存,缓存没有数据,就会请求到数据库上,导致数据库压力剧增。 解决方法: 给不存在的key加上空值,防止每次都会请求到数据库。布隆过滤器…...
Windows server网络安全
摘要 安全策略 IP安全策略,简单的来说就是可以通过做相应的策略来达到放行、阻止相关的端口;放行、阻止相关的IP,如何做安全策略,小编为大家详细的写了相关的步骤: 解说步骤: 阻止所有: 打…...
代理(Delegate)、闭包(Closure)、Notification(通知中心) 和 swift_event_bus适用场景和工作方式
在 Swift 开发中,在 Swift 开发中,代理(Delegate)、闭包(Closure)、Notification(通知中心) 和 swift_event_bus 主要用于 组件之间的通信,但它们的适用场景和工作方式有…...
