目标

亮度,对比度,色度和饱和度都是常见的视频调节参数,也是GStreamer里面设置色彩平衡的参数。本教程将展示:

如何发现可用的色彩平衡通道

如何改变它们

介绍

GStreamer基础教程05——集成GUI工具》里面已经解释了GObject接口:应用通过它们来获得特定功能,而不用去管具体的element的实现。

playbin2实现了色彩平衡的接口(gstcolorbalance),这就可以设置色彩平衡了。如果playbin2里面的任何一个element支持了这个接口,playbin2就仅仅简单地把应用的设置传给element,否则就会在pipeline中增加一个色彩平衡的element。

这个接口允许查询可用的色彩平衡通道(gstcolorbalancechannel),包括它们的名字和值得有效区间,然后调整当前的值。

色彩平衡例子

[objc] view
plain
 copy

  1. #include <string.h>
  2. #include <gst/gst.h>
  3. #include <gst/interfaces/colorbalance.h>
  4. typedef struct _CustomData {
  5. GstElement *pipeline;
  6. GMainLoop *loop;
  7. } CustomData;
  8. /* Process a color balance command */
  9. static void update_color_channel (const gchar *channel_name, gboolean increase, GstColorBalance *cb) {
  10. gdouble step;
  11. gint value;
  12. GstColorBalanceChannel *channel = NULL;
  13. const GList *channels, *l;
  14. /* Retrieve the list of channels and locate the requested one */
  15. channels = gst_color_balance_list_channels (cb);
  16. for (l = channels; l != NULL; l = l->next) {
  17. GstColorBalanceChannel *tmp = (GstColorBalanceChannel *)l->data;
  18. if (g_strrstr (tmp->label, channel_name)) {
  19. channel = tmp;
  20. break;
  21. }
  22. }
  23. if (!channel)
  24. return;
  25. /* Change the channel's value */
  26. .1 * (channel->max_value - channel->min_value);
  27. value = gst_color_balance_get_value (cb, channel);
  28. if (increase) {
  29. value = (gint)(value + step);
  30. if (value > channel->max_value)
  31. value = channel->max_value;
  32. } else {
  33. value = (gint)(value - step);
  34. if (value < channel->min_value)
  35. value = channel->min_value;
  36. }
  37. gst_color_balance_set_value (cb, channel, value);
  38. }
  39. /* Output the current values of all Color Balance channels */
  40. static void print_current_values (GstElement *pipeline) {
  41. const GList *channels, *l;
  42. /* Output Color Balance values */
  43. channels = gst_color_balance_list_channels (GST_COLOR_BALANCE (pipeline));
  44. for (l = channels; l != NULL; l = l->next) {
  45. GstColorBalanceChannel *channel = (GstColorBalanceChannel *)l->data;
  46. gint value = gst_color_balance_get_value (GST_COLOR_BALANCE (pipeline), channel);
  47. g_print ("%s: %3d%% ", channel->label,
  48. 100 * (value - channel->min_value) / (channel->max_value - channel->min_value));
  49. }
  50. g_print ("\n");
  51. }
  52. /* Process keyboard input */
  53. static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) {
  54. gchar *str = NULL;
  55. if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) {
  56. return TRUE;
  57. }
  58. ])) {
  59. case 'c':
  60. ]), GST_COLOR_BALANCE (data->pipeline));
  61. break;
  62. case 'b':
  63. ]), GST_COLOR_BALANCE (data->pipeline));
  64. break;
  65. case 'h':
  66. ]), GST_COLOR_BALANCE (data->pipeline));
  67. break;
  68. case 's':
  69. ]), GST_COLOR_BALANCE (data->pipeline));
  70. break;
  71. case 'q':
  72. g_main_loop_quit (data->loop);
  73. break;
  74. default:
  75. break;
  76. }
  77. g_free (str);
  78. print_current_values (data->pipeline);
  79. return TRUE;
  80. }
  81. int main(int argc, charchar *argv[]) {
  82. CustomData data;
  83. GstStateChangeReturn ret;
  84. GIOChannel *io_stdin;
  85. /* Initialize GStreamer */
  86. gst_init (&argc, &argv);
  87. /* Initialize our data structure */
  88. , sizeof (data));
  89. /* Print usage map */
  90. g_print (
  91. "USAGE: Choose one of the following options, then press enter:\n"
  92. " 'C' to increase contrast, 'c' to decrease contrast\n"
  93. " 'B' to increase brightness, 'b' to decrease brightness\n"
  94. " 'H' to increase hue, 'h' to decrease hue\n"
  95. " 'S' to increase saturation, 's' to decrease saturation\n"
  96. " 'Q' to quit\n");
  97. /* Build the pipeline */
  98. data.pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm", NULL);
  99. /* Add a keyboard watch so we get notified of keystrokes */
  100. #ifdef _WIN32
  101. 2_new_fd (fileno (stdin));
  102. #else
  103. io_stdin = g_io_channel_unix_new (fileno (stdin));
  104. #endif
  105. g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);
  106. /* Start playing */
  107. ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
  108. if (ret == GST_STATE_CHANGE_FAILURE) {
  109. g_printerr ("Unable to set the pipeline to the playing state.\n");
  110. gst_object_unref (data.pipeline);
  111. ;
  112. }
  113. print_current_values (data.pipeline);
  114. /* Create a GLib Main Loop and set it to run */
  115. data.loop = g_main_loop_new (NULL, FALSE);
  116. g_main_loop_run (data.loop);
  117. /* Free resources */
  118. g_main_loop_unref (data.loop);
  119. g_io_channel_unref (io_stdin);
  120. gst_element_set_state (data.pipeline, GST_STATE_NULL);
  121. gst_object_unref (data.pipeline);
  122. ;
  123. }

工作流程

main()函数非常的简单。用一个playbin2的建立pipeline,注册一个键盘处理函数来监控按键。

[objc] view
plain
 copy

  1. /* Output the current values of all Color Balance channels */
  2. static void print_current_values (GstElement *pipeline) {
  3. const GList *channels, *l;
  4. /* Output Color Balance values */
  5. channels = gst_color_balance_list_channels (GST_COLOR_BALANCE (pipeline));
  6. for (l = channels; l != NULL; l = l->next) {
  7. GstColorBalanceChannel *channel = (GstColorBalanceChannel *)l->data;
  8. gint value = gst_color_balance_get_value (GST_COLOR_BALANCE (pipeline), channel);
  9. g_print ("%s: %3d%% ", channel->label,
  10. 100 * (value - channel->min_value) / (channel->max_value - channel->min_value));
  11. }
  12. g_print ("\n");
  13. }

这个方法展示了如何获得通道的列表并打印所有通道当前的值。这是通过gst_color_balance_list_channels()方法来实现的,它会返回一个GList结构,我们遍历这个结构即可。

在这个列表里面的每一个element都是GstColorBalanceChannel结构,包括通道名,最小值和最大值。然后就可以在每个通道调用gst_color_balance_get_value()方法来获得当前值。

在这个例子中,当前值常常用占最大值的百分比来显示。

[objc] view
plain
 copy

  1. /* Process a color balance command */
  2. static void update_color_channel (const gchar *channel_name, gboolean increase, GstColorBalance *cb) {
  3. gdouble step;
  4. gint value;
  5. GstColorBalanceChannel *channel = NULL;
  6. const GList *channels, *l;
  7. /* Retrieve the list of channels and locate the requested one */
  8. channels = gst_color_balance_list_channels (cb);
  9. for (l = channels; l != NULL; l = l->next) {
  10. GstColorBalanceChannel *tmp = (GstColorBalanceChannel *)l->data;
  11. if (g_strrstr (tmp->label, channel_name)) {
  12. channel = tmp;
  13. break;
  14. }
  15. }
  16. if (!channel)
  17. return;

这个方法通过指定通道名来确定通道,然后根据操作增加或者减少值。另外,通道列表的获得后是根据指定的名字来解析获得通道的。很显然,这个列表只应该解析一次,指向通道的指针需要保持在比一个字符串更高效的数据结构中。

[objc] view
plain
 copy

  1. /* Change the channel's value */
  2. .1 * (channel->max_value - channel->min_value);
  3. value = gst_color_balance_get_value (cb, channel);
  4. if (increase) {
  5. value = (gint)(value + step);
  6. if (value > channel->max_value)
  7. value = channel->max_value;
  8. } else {
  9. value = (gint)(value - step);
  10. if (value < channel->min_value)
  11. value = channel->min_value;
  12. }
  13. gst_color_balance_set_value (cb, channel, value);

然后就获得当前通道的值,修改它但确保它的值有效,使用gst_color_balance_set_value()来设置。

其它没有什么了。运行一下这个程序实际看一下效果。

【GStreamer开发】GStreamer播放教程05——色彩平衡的更多相关文章

  1. gstreamer应用开发(播放器)之旅

    GStreamer开发,主要分为两块:应用开发.插件开发. 插件开发人员,通常是编解码库的作者(做出了编解码库后,希望gstreamer能用起来这个库,因此增加这个适配层).芯片原厂人员(将自家的hw ...

  2. 安装gstreamer开发环境

    ubuntu中安装gstreamer开发环境: * 安装gstreamer基本库,工具,以及插件 sudo apt--dev gstreamer-tools gstreamer0.-tools gst ...

  3. 【转】一步一步教你在Ubuntu12.04搭建gstreamer开发环境

    原文网址:http://blog.csdn.net/xsl1990/article/details/8333062 闲得蛋疼    无聊寂寞冷    随便写写弄弄 看到网上蛮多搭建gstreamer开 ...

  4. 开发快平台(M302I小e开发板系列教程)

    开发快平台(M302I小e开发板系列教程) 开发块平台ESP8266模块相关理解 一. M302I小e开发板源码注释,源码基于:v1.4.0.8-u34.zip 1. user_main.c /*** ...

  5. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  6. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

  7. C#开发Unity游戏教程之判断语句

    C#开发Unity游戏教程之判断语句 游戏执行路径的选择——判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏 ...

  8. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  9. C#开发Unity游戏教程之使用脚本变量

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

随机推荐

  1. mongoDB线上数据库连接报错记录

    报错信息提示:无法在第一次连接时连接到服务器 别的一切正常,经过查询得知,是因为如果电脑没设定固定IP,并且重启情况下可能会导致IP地址更改. 解决方法: 将本机ip地址添加到cluster的白名单即 ...

  2. 解决Cannot find config.m4 Make sure that you run '/home/php/bin/phpize' in the top level source directory of the module

    oot@DK:/home/daokr/downfile/php-7.0.0/ext/mysqlnd# /home/php/bin/phpizeCannot find config.m4. Make s ...

  3. 简单理解php的socket编程【网摘】

    php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...

  4. 基于腾讯云监控 API 的 Grafana App 插件开发

    Tencent Cloud Monitor App Grafana 是一个开源的时序性统计和监控平台,支持例如 elasticsearch.graphite.influxdb 等众多的数据源,并以功能 ...

  5. Tkinter 之PanedWindow标签

    一.参数说明 参数 作用 background(bg) 设置背景颜色 borderwidth(bd) 设置边框宽度 cursor  指定当鼠标在PanedWindow上飘过的时候的鼠标样式 handl ...

  6. listview1 保存和读取 listViewItems保存为txt

       /*          *   保存原理          *   将LISTVIEW视为一行一行的字符串          *   将所有的行合并成一个字符串 然后保存为TXT文件       ...

  7. CRMEB中因为重写规则导致的服务器异常和404之解决办法

    问题描述:安装CRMEB后,只能通过https://域名//index.php/admin访问到后台,而不能直接通过https://域名/admin访问到后台,以至于导致进入系统后台出现有的功能界面可 ...

  8. legend3---21、查问题或者查插件的时候请搜索对关键词

    legend3---21.查问题或者查插件的时候请搜索对关键词 一.总结 一句话总结: 比如要查移动端的js图片裁剪插件,直接搜就“移动端的js图片裁剪插件” 千万记得问题和找资料都搜索对关键词(搜索 ...

  9. game-hacking

    https://github.com/dsasmblr/game-hacking Cheat Engine Hacking memory Cheat engine have a feature cal ...

  10. BAT 电脑名 用户名

    @echo offecho 当前盘符:%~d0echo 当前登陆用户:%username%echo 当前盘符和路径:%~dp0echo 当前盘符和路径的短文件名格式:%~sdp0echo 当前批处理全 ...