当前位置: 首页 > article >正文

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/include

LIBS += 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_WIN32
    GIOChannel *io_stdin = g_io_channel_win32_new_fd (fileno (stdin));
#else
    GIOChannel *io_stdin = g_io_channel_unix_new (fileno (stdin));
#endif
    g_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


http://www.kler.cn/a/584995.html

相关文章:

  • FastJSON与Java序列化:数据处理与转换的关键技术
  • Python爬虫实战:基于 Scrapy 框架的腾讯视频数据采集研究
  • 『Rust』Rust运行环境搭建
  • Linux笔记之通配符和正则表达式的区别
  • cocos creator 3.8如何在代码中打印drawcall,fps
  • Matlab 灰度质心法提取条纹中心线
  • Git的详细使用方法
  • 基于stm32的视觉物流机器人
  • 智慧城市新基建!图扑智慧路灯,点亮未来城市生活!
  • AWS云编排详解-Cloud Formation
  • 一文讲清楚CUDA与PyTorch、GPU之间的关系
  • Gemini Robotics:Google DeepMind 让 AI 机器人真正“动”起来!
  • 深度学习——Diffusion Model学习,扩散模型
  • 编程助手学Python--Deepseek对OpenAI的Python库调用GPT-4模型生成对话回复理解
  • 解决启动Vue项目时遇到的 error:0308010C:digital envelope routines::unsupported 错误
  • 深入理解pytest框架中的conftest.py:使用与作用原理
  • 爬取数据时如何处理可能出现的异常?
  • 系统开发资源
  • Qt 实现透明可移动悬浮工具条
  • c#面试题整理10