分类目录归档:Processing

Processing 导出视频的两种方式

 1.前言

Processing 作为一款创意编程工具,不仅可以很方便的用来控制视频,比如用来 控制播放透明通道的视频,也可以用它来编写一些酷炫的效果,然后通过程序生成视频。

Processing 生成视频或者说录制视频,目前主要有两种方式,下面谈谈两种方式的使用方法及区别。

2.视频导出方式

a.使用 Movie Maker 导出

Movie Maker 是 Processing IDE 自带的一个视频合成工具,可以根据需要设置序列帧图片以及音频,然后生成视频。

优点

  • 有操作界面、使用简单,是一个独立的工具软件。

缺点

  • 没有提供相关接口,不能在 Processing 程序中集成开发。

使用步骤

需要提供序列帧图片。在 Processing 中用自带导出图片的 API 生成序列帧图片:

saveFrame(); //保存序列帧图片

有了序列帧图片就可以打开 Processing -> 工具 -> Movie Maker,然后根据文字介绍操作。

b.使用 VideoExport 导出

VideoExport 是 Processing 的一个第三方库,下载后放入相应位置即可使用。

优点

  • 可以方便的在程序中集成开发,可以根据需求灵活的控制导出时机和时长。

缺点

  • 依赖 ffmpeg,所以使用前需要先安装。

步骤

import com.hamoid.*;

VideoExport videoExport;

// demo,录制会自动结束

float movieFPS = 30;
float soundDuration = 10.03; // in seconds

void setup() {
    size(600, 600);

    videoExport = new VideoExport(this);
    videoExport.setFrameRate(movieFPS);
    videoExport.setAudioFileName("test-sound.mp3");
    videoExport.startMovie();
}

void draw() {
    background(#888888);
    rect(frameCount * frameCount % width, 0, 40, height);
    videoExport.saveFrame();
    if(frameCount > round(movieFPS * soundDuration)) {
        videoExport.endMovie();
        exit();
    }
}

3.小结

工具/库 优点 缺点
Movie Maker 有操作界面、使用简单,是一个独立的工具软件。 没有提供相关接口,不能在 Processing 程序中集成开发。
VideoExport 可以方便的在程序中集成开发,可以根据需求灵活的控制导出时机和时长。 使用前需要先安装 [ffmpeg](http://ffmpeg.org/)。

通过表格比较可以很清楚的得知两种方式的使用场景并不一样,并不能互相取代,而是一种互补的关系。因此具体选择哪一个使用,完全可以根据业务需求来定。

THE END

Processing 播放透明通道视频

1.前言

Processing 是一种基于 Java 且简化了语法的编程语言,拥有丰富的第三方库,开发者也能非常容易的扩展开发出满足自己独特需求的库。因此在一些交互场景项目中,Processing 通常是我首选的工具。

2.需求

实际项目中,往往需要加入一些效果好的动效。

比如在原来的背景上,加入一个酷炫的动画。通常可以使用 gif 图来解决,但有时 gif 图会出现锯齿,效果不理想,又或者需要加入声音,那么就只能采用带透明通道的视频来解决了。

假设现在的需求如下:在原来的视频之上叠加一个类似摄像机在录制的一个动画,如下图:

3.分析

正常情况下,两个相同分辨率的视频叠加处理如下:

import processing.video.*;

Movie v1, v2;

void setup() {
  size(640, 480);
  v1 = new Movie(this, "1.mov");
  v1.loop();
  v2 = new Movie(this, "2.mov");
  v2.loop();
}

void draw() {
  background(255);
  image(v1, 0, 0, width, height);
  image(v2, 0, 0, width, height);
}

void movieEvent(Movie m) {
  m.read();
}

但是这样 v2 会直接把 v1 覆盖掉,透明通道并没有生效。效果如下:

正确处理透明通道代码如下:

import processing.video.*;

Movie v1, v2;

void setup() {
  size(640, 480, P2D);
  //如果需要全屏的话, 把 size(640, 480, P2D) 换成 fullScreen(P2D) 即可
  //fullScreen(P2D);
  v1 = new Movie(this, "1.mov");
  v1.loop();
  v2 = new Movie(this, "2.mov");
  v2.loop();
}

void draw() {
  background(255);
  image(v1, 0, 0, width, height);
  image(v2, 0, 0, width, height);
}

void movieEvent(Movie m) {
  m.read();
}

相信你已经看出来了,关键就在于有没有 P2D,但实际上如果把 P2D 改成 P3D 也是可以的。而缺省值则代表 JAVA2D,这个是不支持透明通道视频的。

附:

size(width, height, renderer)
fullScreen(renderer)

Parameters
renderer	String: the renderer to use, e.g. P2D, P3D, JAVA2D (default)
THE END