【GStreamer开发】GStreamer播放教程05——色彩平衡
目标
亮度,对比度,色度和饱和度都是常见的视频调节参数,也是GStreamer里面设置色彩平衡的参数。本教程将展示:
如何发现可用的色彩平衡通道
如何改变它们
介绍
《GStreamer基础教程05——集成GUI工具》里面已经解释了GObject接口:应用通过它们来获得特定功能,而不用去管具体的element的实现。
playbin2实现了色彩平衡的接口(gstcolorbalance),这就可以设置色彩平衡了。如果playbin2里面的任何一个element支持了这个接口,playbin2就仅仅简单地把应用的设置传给element,否则就会在pipeline中增加一个色彩平衡的element。
这个接口允许查询可用的色彩平衡通道(gstcolorbalancechannel),包括它们的名字和值得有效区间,然后调整当前的值。
色彩平衡例子
- #include <string.h>
- #include <gst/gst.h>
- #include <gst/interfaces/colorbalance.h>
- typedef struct _CustomData {
- GstElement *pipeline;
- GMainLoop *loop;
- } CustomData;
- /* Process a color balance command */
- static void update_color_channel (const gchar *channel_name, gboolean increase, GstColorBalance *cb) {
- gdouble step;
- gint value;
- GstColorBalanceChannel *channel = NULL;
- const GList *channels, *l;
- /* Retrieve the list of channels and locate the requested one */
- channels = gst_color_balance_list_channels (cb);
- for (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;
- /* Change the channel's value */
- .1 * (channel->max_value - channel->min_value);
- 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, *l;
- /* Output Color Balance values */
- channels = gst_color_balance_list_channels (GST_COLOR_BALANCE (pipeline));
- for (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");
- }
- /* Process keyboard input */
- 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;
- }
- ])) {
- case 'c':
- ]), GST_COLOR_BALANCE (data->pipeline));
- break;
- case 'b':
- ]), GST_COLOR_BALANCE (data->pipeline));
- break;
- case 'h':
- ]), GST_COLOR_BALANCE (data->pipeline));
- break;
- case 's':
- ]), 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, charchar *argv[]) {
- CustomData data;
- GstStateChangeReturn ret;
- GIOChannel *io_stdin;
- /* Initialize GStreamer */
- gst_init (&argc, &argv);
- /* Initialize our data structure */
- , sizeof (data));
- /* Print usage map */
- 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");
- /* Build the pipeline */
- data.pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm", NULL);
- /* Add a keyboard watch so we get notified of keystrokes */
- #ifdef _WIN32
- 2_new_fd (fileno (stdin));
- #else
- io_stdin = g_io_channel_unix_new (fileno (stdin));
- #endif
- g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);
- /* Start playing */
- 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);
- ;
- }
- print_current_values (data.pipeline);
- /* Create a GLib Main Loop and set it to run */
- data.loop = g_main_loop_new (NULL, FALSE);
- g_main_loop_run (data.loop);
- /* Free resources */
- 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);
- ;
- }
工作流程
main()函数非常的简单。用一个playbin2的建立pipeline,注册一个键盘处理函数来监控按键。
- /* Output the current values of all Color Balance channels */
- static void print_current_values (GstElement *pipeline) {
- const GList *channels, *l;
- /* Output Color Balance values */
- channels = gst_color_balance_list_channels (GST_COLOR_BALANCE (pipeline));
- for (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");
- }
这个方法展示了如何获得通道的列表并打印所有通道当前的值。这是通过gst_color_balance_list_channels()方法来实现的,它会返回一个GList结构,我们遍历这个结构即可。
在这个列表里面的每一个element都是GstColorBalanceChannel结构,包括通道名,最小值和最大值。然后就可以在每个通道调用gst_color_balance_get_value()方法来获得当前值。
在这个例子中,当前值常常用占最大值的百分比来显示。
- /* Process a color balance command */
- static void update_color_channel (const gchar *channel_name, gboolean increase, GstColorBalance *cb) {
- gdouble step;
- gint value;
- GstColorBalanceChannel *channel = NULL;
- const GList *channels, *l;
- /* Retrieve the list of channels and locate the requested one */
- channels = gst_color_balance_list_channels (cb);
- for (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;
这个方法通过指定通道名来确定通道,然后根据操作增加或者减少值。另外,通道列表的获得后是根据指定的名字来解析获得通道的。很显然,这个列表只应该解析一次,指向通道的指针需要保持在比一个字符串更高效的数据结构中。
- /* Change the channel's value */
- .1 * (channel->max_value - channel->min_value);
- 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);
然后就获得当前通道的值,修改它但确保它的值有效,使用gst_color_balance_set_value()来设置。
其它没有什么了。运行一下这个程序实际看一下效果。
【GStreamer开发】GStreamer播放教程05——色彩平衡的更多相关文章
- gstreamer应用开发(播放器)之旅
GStreamer开发,主要分为两块:应用开发.插件开发. 插件开发人员,通常是编解码库的作者(做出了编解码库后,希望gstreamer能用起来这个库,因此增加这个适配层).芯片原厂人员(将自家的hw ...
- 安装gstreamer开发环境
ubuntu中安装gstreamer开发环境: * 安装gstreamer基本库,工具,以及插件 sudo apt--dev gstreamer-tools gstreamer0.-tools gst ...
- 【转】一步一步教你在Ubuntu12.04搭建gstreamer开发环境
原文网址:http://blog.csdn.net/xsl1990/article/details/8333062 闲得蛋疼 无聊寂寞冷 随便写写弄弄 看到网上蛮多搭建gstreamer开 ...
- 开发快平台(M302I小e开发板系列教程)
开发快平台(M302I小e开发板系列教程) 开发块平台ESP8266模块相关理解 一. M302I小e开发板源码注释,源码基于:v1.4.0.8-u34.zip 1. user_main.c /*** ...
- Apple Watch开发快速入门教程
Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...
- C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例
C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...
- C#开发Unity游戏教程之判断语句
C#开发Unity游戏教程之判断语句 游戏执行路径的选择——判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏 ...
- C#开发Unity游戏教程之游戏对象的行为逻辑方法
C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...
- C#开发Unity游戏教程之使用脚本变量
C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...
随机推荐
- windows错误代码摘录
Windows API 错误代码定义在winerror.h里,当我们得到一个Error Code不知其意时,可以查阅这个文件 这里定义了绝大部分的错误,摘录翻译如下 [0]-操作成功完成. [1]-功 ...
- HTML5新增常用标签
1.header 标签定义文档的页眉(介绍信息). <body> <article> <header> <h1>What Does WWF Do?< ...
- [hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法
今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相 ...
- AtCoder Grand Contest 018题解
传送门 \(A\) 根据裴蜀定理显然要\(k|\gcd(a_1,...,a_n)\),顺便注意不能造出大于\(\max(a_1,...,a_n)\)的数 int n,g,k,x,mx; int mai ...
- PageHelper的问题
如果分页语句没有被消耗掉,它一直保留着,直到被织入到下一次查询语句,如果 被织入的查询语句自己有LIMIT限制,那么两个LIMIT就导致语法错误了. PageHelper.startPage(page ...
- js 中数组对象的定义赋值 以及方法
1.定义数组 var m=new Array(); var n=[]; 2.数组的赋值(两种) A. var m=new Array(2); 一个值表示数组length var m=new Array ...
- Redis哨兵参数
一.常用命令 sentinel的基本状态信息INFO 列出所有被监视的主服务器,以及这些主服务器的当前状态SENTINEL masters 列出指定主redis的从节点状态情况SENTINEL sla ...
- Android根据内网外网连接情况配置服务器访问IP
新项目的app,可通过内网和外网的服务器ip进行请求访问,但是客户提供了专业终端,终端在wifi情况下走外网内网都可以,但关闭wifi则只能走4G专网,也就是只能走内网. 可前往我的小站查看:Andr ...
- Linux下用jar命令替换war包中的文件【转】
问题背景:在Linux环境上的weblogic发布war包,有时候只是修改了几个文件,也要上传整个war包,这样很费时间,因此整理了一下Linux环境,更新单个文件的方法. 1.如果要替换的文件直接在 ...
- 深入理解JS中&&和||
写了这么多JS,才发现JS的语法既是属于C语系的,又与一般C语系的编程语言某些地方有很大区别,其中&&和||就是其中一例. C语系中的&&和|| C语系的&&a ...
