欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > GStreamer —— 2.17、Windows下Qt加载GStreamer库后运行 - “播放教程 5:色彩平衡“(附:完整源码)

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

2025/3/12 7:34:35 来源:https://blog.csdn.net/automoblie0/article/details/146180691  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词