GStreamer——教程——播放教程6:Audio visualization

播放教程6:可视化音频

目标

GStreamer有一系列把音频转换成视频的element。他们可以用于科学的目的或者增加音乐播放器的趣味性。本教程展示:

  • 如何启用音频可视化
  • 如何选择可视化元素

介绍

在playbin里面运行音频可视化是非常容易的。当遇到一个只有音频的流时,只需要正确地设置playbin的一些标志就行了。它会自己创建必要的element然后显示的。

如果你想要增加实际的element的趣味性,你要自己实例化它然后通过vis-plug属性来告诉playbin。

本教程GStreamer注册的所有关于可视化的element,选择了goom并传给了playbin。

一个有趣的音乐播放器

将此代码复制到名为playback-tutorial-6.c文本文件中。

playback-tutorial-6.c

#include <gst/gst.h>

/* playbin flags */
typedef enum {
  GST_PLAY_FLAG_VIS           = (1 << 3) /* Enable rendering of visualizations when there is no video stream. */
} GstPlayFlags;

/* Return TRUE if this is a Visualization element */
static gboolean filter_vis_features (GstPluginFeature *feature, gpointer data) {
  GstElementFactory *factory;

  if (!GST_IS_ELEMENT_FACTORY (feature))
    return FALSE;
  factory = GST_ELEMENT_FACTORY (feature);
  if (!g_strrstr (gst_element_factory_get_klass (factory), "Visualization"))
    return FALSE;

  return TRUE;
}

int main(int argc, char *argv[]) {
  GstElement *pipeline, *vis_plugin;
  GstBus *bus;
  GstMessage *msg;
  GList *list, *walk;
  GstElementFactory *selected_factory = NULL;
  guint flags;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Get a list of all visualization plugins */
  list = gst_registry_feature_filter (gst_registry_get (), filter_vis_features, FALSE, NULL);

  /* Print their names */
  g_print("Available visualization plugins:\n");
  for (walk = list; walk != NULL; walk = g_list_next (walk)) {
    const gchar *name;
    GstElementFactory *factory;

    factory = GST_ELEMENT_FACTORY (walk->data);
    name = gst_element_factory_get_longname (factory);
    g_print("  %s\n", name);

    if (selected_factory == NULL || g_str_has_prefix (name, "GOOM")) {
      selected_factory = factory;
    }
  }

  /* Don't use the factory if it's still empty */
  /* e.g. no visualization plugins found */
  if (!selected_factory) {
    g_print ("No visualization plugins found!\n");
    return -1;
  }

  /* We have now selected a factory for the visualization element */
  g_print ("Selected '%s'\n", gst_element_factory_get_longname (selected_factory));
  vis_plugin = gst_element_factory_create (selected_factory, NULL);
  if (!vis_plugin)
    return -1;

  /* Build the pipeline */
  pipeline = gst_parse_launch ("playbin uri=http://radio.hbr1.com:19800/ambient.ogg", NULL);

  /* Set the visualization flag */
  g_object_get (pipeline, "flags", &flags, NULL);
  flags |= GST_PLAY_FLAG_VIS;
  g_object_set (pipeline, "flags", flags, NULL);

  /* set vis plugin for playbin */
  g_object_set (pipeline, "vis-plugin", vis_plugin, NULL);

  /* Start playing */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* Wait until error or EOS */
  bus = gst_element_get_bus (pipeline);
  msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

  /* Free resources */
  if (msg != NULL)
    gst_message_unref (msg);
  gst_plugin_feature_list_free (list);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

如果您需要帮助来编译此代码,请参阅 构建教程部分为您的平台:Mac或 Windows或在Linux上使用此特定命令:

gcc playback-tutorial-6.c -o playback-tutorial-6 `pkg-config --cflags --libs gstreamer-1.0`

如果您需要帮助来运行此代码,请参阅为您的平台运行教程部分:Mac OS XWindows、for iOS安卓

本教程播放来自HBR1网络电台的音乐。应该打开一个窗口,显示随着音乐移动的迷幻色彩图案。媒体是从互联网上获取的,所以窗口可能需要几秒钟才能出现,这取决于你的连接速度。

所需库:gstreamer-1.0

工作流

首先,我们都知道通过设置GST_PLAY_FLAG_VIS标志可以让playbin的音频可视化。如果媒体文件里面已经包含了视频,那么这个标志就不起作用。

/* Set the visualization flag */
g_object_get (pipeline, "flags", &flags, NULL);
flags |= GST_PLAY_FLAG_VIS;
g_object_set (pipeline, "flags", flags, NULL);

如果用户没有指定可视化插件,playbin会使用goom来做(如果没有这个element就不能进行音频可视化)。本教程剩下的部分会显示如何来发现一个可用的可视化element并指定playbin使用。

/* Get a list of all visualization plugins */
list = gst_registry_feature_filter (gst_registry_get (), filter_vis_features, FALSE, NULL);

      gst_registry_feature_filter()检查GStreamer当前所有注册的element并选择那些filter_vis_features函数返回TRUE的element。

/* Return TRUE if this is a Visualization element */
static gboolean filter_vis_features (GstPluginFeature *feature, gpointer data) {
  GstElementFactory *factory;

  if (!GST_IS_ELEMENT_FACTORY (feature))
    return FALSE;
  factory = GST_ELEMENT_FACTORY (feature);
  if (!g_strrstr (gst_element_factory_get_klass (factory), "Visualization"))
    return FALSE;

  return TRUE;
}

这里牵涉到一点关于GStreamer element的理论:每一个GStreamer在运行时加载的文件都被认为是插件(GstPlugin)。一个插件可以包含许多特性 (GstPluginFeature)。有不同种类的功能,其中, 我们一直使用的元素工厂(GstElementFactory) 构建元素(GstElement)。

此功能简单地忽略了所有不是工厂的功能, 然后是所有工厂,其类(获得与 gst_element_factory_get_klass()())不包括可视化。作为 在工厂类GstElementFactory的留档中说明 是一个“字符串,描述元素的类型,作为无序列表 用斜线分隔 (/)”. 类的例子是“源/网络”, “编解码器/解码器/视频”、“编解码器/编码器/音频”或“可视化”。

/* Print their names */
g_print("Available visualization plugins:\n");
for (walk = list; walk != NULL; walk = g_list_next (walk)) {
  const gchar *name;
  GstElementFactory *factory;

  factory = GST_ELEMENT_FACTORY (walk->data);
  name = gst_element_factory_get_longname (factory);
  g_print("  %s\n", name);

  if (selected_factory == NULL || g_str_has_prefix (name, "GOOM")) {
    selected_factory = factory;
  }
}

一旦我们有了可视化插件的列表,我们会打印出它们的名字(gst_element_factory_get_longname())并选择一个(比如:GOOM)。

/* We have now selected a factory for the visualization element */
g_print ("Selected '%s'\n", gst_element_factory_get_longname (selected_factory));
vis_plugin = gst_element_factory_create (selected_factory, NULL);
if (!vis_plugin)
  return -1;

选中的工厂用来生成一个GstElement,通过vis-plugin属性来传给playbin:

/* set vis plugin for playbin */
g_object_set (pipeline, "vis-plugin", vis_plugin, NULL);

我们完成了。

结论

本教程显示:

  • 如何在playbin中启用音频可视化 GST_PLAY_FLAG_VIS 标志
  • 如何强制一个特定的可视化元素 vis-plugin playbin属性
  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值