【GStreamer开发】GStreamer播放教程05——色彩平衡

摘要:
目标亮度,对比度,色度和饱和度都是常见的视频调节参数,也是GStreamer里面设置色彩平衡的参数。playbin2实现了色彩平衡的接口,这就可以设置色彩平衡了。如果playbin2里面的任何一个element支持了这个接口,playbin2就仅仅简单地把应用的设置传给element,否则就会在pipeline中增加一个色彩平衡的element。

目标

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

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

如何改变它们

介绍

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

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

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

色彩平衡例子

  1. #include<string.h>
  2. #include<gst/gst.h>
  3. #include<gst/interfaces/colorbalance.h>
  4. typedefstruct_CustomData{
  5. GstElement*pipeline;
  6. GMainLoop*loop;
  7. }CustomData;
  8. /*Processacolorbalancecommand*/
  9. staticvoidupdate_color_channel(constgchar*channel_name,gbooleanincrease,GstColorBalance*cb){
  10. gdoublestep;
  11. gintvalue;
  12. GstColorBalanceChannel*channel=NULL;
  13. constGList*channels,*l;
  14. /*Retrievethelistofchannelsandlocatetherequestedone*/
  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. /*Changethechannel'svalue*/
  26. step=0.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. /*OutputthecurrentvaluesofallColorBalancechannels*/
  40. staticvoidprint_current_values(GstElement*pipeline){
  41. constGList*channels,*l;
  42. /*OutputColorBalancevalues*/
  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. gintvalue=gst_color_balance_get_value(GST_COLOR_BALANCE(pipeline),channel);
  47. g_print("%s:%3d%%",channel->label,
  48. 1100*(value-channel->min_value)/(channel->max_value-channel->min_value));
  49. }
  50. g_print(" ");
  51. }
  52. /*Processkeyboardinput*/
  53. staticgbooleanhandle_keyboard(GIOChannel*source,GIOConditioncond,CustomData*data){
  54. gchar*str=NULL;
  55. if(g_io_channel_read_line(source,&str,NULL,NULL,NULL)!=G_IO_STATUS_NORMAL){
  56. returnTRUE;
  57. }
  58. switch(g_ascii_tolower(str[0])){
  59. case'c':
  60. update_color_channel("CONTRAST",g_ascii_isupper(str[0]),GST_COLOR_BALANCE(data->pipeline));
  61. break;
  62. case'b':
  63. update_color_channel("BRIGHTNESS",g_ascii_isupper(str[0]),GST_COLOR_BALANCE(data->pipeline));
  64. break;
  65. case'h':
  66. update_color_channel("HUE",g_ascii_isupper(str[0]),GST_COLOR_BALANCE(data->pipeline));
  67. break;
  68. case's':
  69. update_color_channel("SATURATION",g_ascii_isupper(str[0]),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. returnTRUE;
  80. }
  81. intmain(intargc,charchar*argv[]){
  82. CustomDatadata;
  83. GstStateChangeReturnret;
  84. GIOChannel*io_stdin;
  85. /*InitializeGStreamer*/
  86. gst_init(&argc,&argv);
  87. /*Initializeourdatastructure*/
  88. memset(&data,0,sizeof(data));
  89. /*Printusagemap*/
  90. g_print(
  91. "USAGE:Chooseoneofthefollowingoptions,thenpressenter: "
  92. "'C'toincreasecontrast,'c'todecreasecontrast "
  93. "'B'toincreasebrightness,'b'todecreasebrightness "
  94. "'H'toincreasehue,'h'todecreasehue "
  95. "'S'toincreasesaturation,'s'todecreasesaturation "
  96. "'Q'toquit ");
  97. /*Buildthepipeline*/
  98. data.pipeline=gst_parse_launch("playbin2uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm",NULL);
  99. /*Addakeyboardwatchsowegetnotifiedofkeystrokes*/
  100. #ifdef_WIN32
  101. io_stdin=g_io_channel_win32_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. /*Startplaying*/
  107. ret=gst_element_set_state(data.pipeline,GST_STATE_PLAYING);
  108. if(ret==GST_STATE_CHANGE_FAILURE){
  109. g_printerr("Unabletosetthepipelinetotheplayingstate. ");
  110. gst_object_unref(data.pipeline);
  111. return-1;
  112. }
  113. print_current_values(data.pipeline);
  114. /*CreateaGLibMainLoopandsetittorun*/
  115. data.loop=g_main_loop_new(NULL,FALSE);
  116. g_main_loop_run(data.loop);
  117. /*Freeresources*/
  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. return0;
  123. }

工作流程

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

  1. /*OutputthecurrentvaluesofallColorBalancechannels*/
  2. staticvoidprint_current_values(GstElement*pipeline){
  3. constGList*channels,*l;
  4. /*OutputColorBalancevalues*/
  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. gintvalue=gst_color_balance_get_value(GST_COLOR_BALANCE(pipeline),channel);
  9. g_print("%s:%3d%%",channel->label,
  10. 1100*(value-channel->min_value)/(channel->max_value-channel->min_value));
  11. }
  12. g_print(" ");
  13. }

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

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

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

  1. /*Processacolorbalancecommand*/
  2. staticvoidupdate_color_channel(constgchar*channel_name,gbooleanincrease,GstColorBalance*cb){
  3. gdoublestep;
  4. gintvalue;
  5. GstColorBalanceChannel*channel=NULL;
  6. constGList*channels,*l;
  7. /*Retrievethelistofchannelsandlocatetherequestedone*/
  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;

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

  1. /*Changethechannel'svalue*/
  2. step=0.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——色彩平衡》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇有赞的深度需求功能测试pybot/robot命令参数说明【dos下执行命令pybot.bat --help查看】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

还原数据库备份文件时,关于“System.Data.SqlClient.SqlError:媒体集有2个媒体簇,但只提供了1个。必须提供所有成员”的处理方式

好久没写博客了,最近在做毕设的权限管理模块,今天在还原数据库文件时,遇到了“System.Data.SqlClient.SqlError:媒体集有2个媒体簇,但只提供了1个。必须提供所有成员”这个错误,百度了一下,找到了原因和解决方式。 原因分析:1。备份的时候,旧路径没有删除,我添加了一个新路径,就无意中设置成了两个备份路径,SQL就会根据两个备份路径把...

Android如何快速卸载apk

       在Adnroid中,直接运行ADB UNInstall无法卸载APK。害得哥每次进Settings去手工去卸载。        今天哥终于受不了,直接在DDMS里删除APK。然后再运行ADB UNINSTALL,居然成功!        所以哥马上写了三个脚本,一个是删除APK包括它下面的sqlite,share pref等,还有一个是卸载这...

AntDesignVue中关于Table组件的使用

1. 如何自定义表格列头: <a-table :columns="columns":dataSource="dataSource"> <span slot="customTitle"><a-icon type="smile-o"/>Name</span> </a-tabl...

小代码编写神器:LINQPad 使用入门

一:概述 1:想查看程序运行结果,又不想启动 VS 怎么办? 2:想测试下自己的 C# 能力,不使用 VS 的智能感知,怎么办? 那么,我们有一个选择,使用神器 LINQPad(http://www.linqpad.net/)。 二:入门 1:使用 C# Statement 直接在 1 处选择,然后在 2 处写 C# 代码,注意,语法中 Dump() 一下...

如何使用php生成唯一ID的4种方法

php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID。由于生成唯一ID与微秒时间关联,因此ID的唯一性非常可靠。 生成的唯一ID默认返回的字符串有 13 个字符串长,如果再结合md5()函数,生成的唯一ID可靠性将更高,这种生成的ID比随机性的ID 最大优点在于可...

js 调用微信浏览器内置方法,启动支付

$.post("{php echo app_url('pay/cash')}",{orderno:orderno,paytype:paytype},function(m){ //todo: 跳转到微信支付,获取支付的相关信息 if(!m.errno){...