【问题标题】:How to create a translucent audio-reactive overlay with Processing?如何使用处理创建半透明的音频反应覆盖?
【发布时间】:2019-06-28 06:28:21
【问题描述】:

我已经广泛研究了这个问题,但找不到任何有用的答案。基本上,我想创建一个半透明(或半透明)的音频反应叠加层,它可以转置到通用视频文件上。我们的想法是让视频看起来与音轨一起跳动。

我想我可以用 Processing 和 minim 库来实现这个效果,但我不知道如何制定草图。输出应为 1920x1080,脉动叠加应产生充满活力的光度感(例如,亮度为 30-50% 且不透明度可能为 25-50% 的浅色)。

我正在使用@george-profenza 提供的草图更新这个挑战(修改为使用视频而不是凸轮输入):

import processing.video.*;

Movie movie;
PGraphics overlay;

import ddf.minim.*;

Minim minim;
AudioInput in;

void setup(){
  size(320,240);

  movie = new Movie(this, "input.mp4");
  movie.play();

  // setup sound
  minim = new Minim(this);
  in = minim.getLineIn();

  // setup overlay
  overlay = createGraphics(width,height);
  // initial draw attributes
  overlay.beginDraw();
  overlay.strokeWeight(3);
  overlay.rectMode(CENTER);
  overlay.noFill();
  overlay.stroke(255,255,255,32);
  overlay.endDraw();
}

void draw(){

  //update overlay based on audio data
  overlay.beginDraw();
  overlay.background(0,0);
  for(int i = 0; i < in.bufferSize() - 1; i++)
  {
    overlay.line( i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50 );
    overlay.line( i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50 );
  }
  overlay.endDraw();
  //render video then overlay composite
  image(movie,0,0);
  image(overlay,0,0);
}
// update movie
void movieEvent(Movie m){
  m.read();
}

大概这个草图有效,但不幸的是,底层 processing.video (GStreamer 1+) 库似乎在 Ubuntu 上出现故障(并且似乎没有办法使用社区提供的分支之一来更新库,根据 GitHub 上的issue #90

如果有人可以提出解决此问题的方法或有其他解决方案,我将不胜感激。

【问题讨论】:

    标签: audio video shared-libraries processing minim


    【解决方案1】:

    这是一个广泛的问题。我将介绍几个方面:

    1. 半透明(音频反应)覆盖:查看PGraphics。就像处理中的层。您可以在 PGraphics 中绘制(使用半透明等),然后按照您想要的顺序进行渲染。请参阅下面的评论示例
    2. audio-reactive:您可以使用 minim,即使用响度、FFT 数据或其他一些可以进行更高级音频分析的软件,您可以从中导出数据以供处理读取。
    3. 1920x1080 输出:根据我的个人经验,在撰写本文时,我惊讶地发现在 Processing 中播放的 1080p 视频还不错,但不是超级清晰(我会偶尔体验一下,经过测试在具有 16GB RAM 的 macbook 和同样具有 16GB RAM 的 PC 上)。在顶部进行声音分析和叠加图形可能会进一步降低性能,主要问题是音频和合成图形之间的同步,即您希望实时执行此操作。

    如果您只是想输出具有漂亮的生成式音频响应图形但不需要实时的视频,我建议您采用更“离线”的方法:

    • 对音频数据进行预分析,以便只提供驱动视觉效果所需的内容(可以像响度一样简单)
    • 制作具有实时音频且无视频的低分辨率视觉原型,以查看外观/感觉是否良好
    • 以 1080p 逐帧渲染视频 + 视觉效果(具有声音映射属性),然后与音频同步渲染(可以使用 After Effects、ffmpeg 等)

    这里有一个非常基本的概念证明草图作为参考,它演示了:

    • 使用叠加图形
    • 将叠加图形更新为音频响应式(Minim MonitorInput 示例)
    • 合成视频 + 叠加层

    注意低分辨率视频的大小。

    import processing.video.*;
    
    Capture cam;
    PGraphics overlay;
    
    import ddf.minim.*;
    
    Minim minim;
    AudioInput in;
    
    
    void setup(){
      size(320,240);
    
      // setup video (may be video instead of webcam in your case)
      cam = new Capture(this,width,height);
      cam.start();
    
      // setup sound
      minim = new Minim(this);
      in = minim.getLineIn();
    
      // setup overlay
      overlay = createGraphics(width,height);
      // initial draw attributes
      overlay.beginDraw();
      overlay.strokeWeight(3);
      overlay.rectMode(CENTER);
      overlay.noFill();
      overlay.stroke(255,255,255,32);
      overlay.endDraw();
    }
    
    void draw(){
    
      //update overlay based on audio data
      overlay.beginDraw();
      overlay.background(0,0);
      for(int i = 0; i < in.bufferSize() - 1; i++)
      {
        overlay.line( i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50 );
        overlay.line( i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50 );
      }
      overlay.endDraw();
      //render video then overlay composite
      image(cam,0,0);
      image(overlay,0,0);
    }
    // update video (may be movieEvent(Movie m) for you
    void captureEvent(Capture c){
      c.read();
    }
    

    【讨论】:

    • 没有找到任何可以模拟凸轮输入的东西,所以我将草图修改为:Movie movie; 而不是Capture cam;movie = new Movie(this, "path/to/video.mp4"); 而不是cam = new Capture (this, width, height);movie.play(); 而不是cam.start();image(movie,0,0); 而不是 image(cam,0,0);。但是,此错误会显示消息“此草图使用的库未正确安装”。关于“UnsatisfiedLinkError”,关于“依赖于不可用的本机代码”的库,以及关于运行“32 位应用程序”的一些东西。
    • 还尝试了void movieEvent(Movie m){ m.read(); }void movieEvent(Movie movie){ movie.read(); },而不是您建议的void captureEvent(Capture c){ c.read(); },但此错误并显示相同的消息。
    • FWIW 产生错误的行是movie = new Movie(this, "/path/to/video");。不知道为什么这会导致问题。应安装所有相关库。
    • 看起来底层 GStreamer 库不稳定或不再受 Ubuntu 支持:github.com/processing/processing-video/issues/90。恐怕对我来说是死路一条。
    • @Introspectre 你很高兴从captureEvent 切换到movieEvent 等等。我已经很久没有在Ubuntu 上使用处理视频库了,也没有意识到是否有这样的问题.也许也可以试试processing-glvideo 库。如果两者都不起作用并且您想使用处理,您可以转换您的图像序列(保持声音分开)。或者,您可以尝试其他创意编码工具包,例如 OpenFrameworks(c++ 但受处理的启发) 或 cinder(c++)...
    【解决方案2】:

    首先要熟悉编写视频文件,您需要以某种方式保存输出。确保您可以正常读取文件。除非您想使用麦克风中的音频,否则您将需要访问视频文件的音频 (?)。 透明覆盖很容易,只需用更少的 alpha 进行绘制

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多