Processing可以播放视频,对视频进行简单处理,生成视频等等。可是自己编的程序却一直都打不开视频,而运行例子却很正常。我使用的是 processing-2.0b9-windows32 版本,是在学习《Processing互动编程艺术》的第9.1节时遇到这个问题的。本以为是编码的问题,但是把例子中自带的“transit.mov”视频拿来用还是打不开。真是百思不得其解。因为是在初学,完全是照着例子写的,检查多次都没有错。 于是在processing.org上去找原因。

最后才发现是少了视频不间断读取这一块:

[cc lang=”java”]
// Called every time a new frame is available to read
void movieEvent(Movie m) {
m.read();
}
[/cc]
加上之后就成功运行了。

既然是要说心得,现在说说找的时候学到了什么。我首先找到了 Video library (视频库)(地址:http://processing.org/reference/libraries/video/index.html)。查看库的说明后发现,需要安装Quicktime才行。原文说“For the Processing Video library to work, it is necessary to have QuickTime installed on your computer. Download and install QuickTime (or iTunes, which includes QuickTime). Other solutions such as QuickTime Alternative or QT Lite will not work and should be avoided.”(原文地址:http://wiki.processing.org/w/Video_Issues)。但是奇怪的是,没有安装Quicktime的我,程序自带的例子是可以运行的啊。我想肯定是我的电脑安装了QQ影音,估计里面包含了解码程序,所以我就不用再安装 QuickTime 了。一般就是这一,只要系统中安装了解码程序就可以解码视频了。说需要安装 QuickTime,其实也就是说要安装 *.mov 的解码程序罢了。既然可以运行,于是就仔细看例子。

打开 Example->Libraries->video->Movie (见下图)下的例子,可以看到它们的代码,但我不想花太多时间看了。于是在官网上看到了一个读取视频的例子(地址:http://processing.org/reference/libraries/video/Movie_read_.html

读取视频的例子很简单,下面是详细说明:

This reference is for Processing 2.0+. If you have a previous version, use the reference included with your software. If you see any errors or have suggestions, please let us know. If you prefer a more technical reference, visit the Processing Javadoc.

Class Movie
Name read()
Examples
Description Reads the current frame of the movie.
Syntax .read()
Returns void

于是给我的程序添上了读取代码(就是一开始的那一段),顺利打开了。如图:

为了验证不完全是视频编码的问题,又测试了其他视频。下面这个是mov格式,h264编码,也顺利打开了。

mov格式,h264编码

测试后发现,mp4格式是打不开的,这和官方网站上的说法是一致的。希望 processing 以后能够打开大多数格式和编码的视频。另外经过测试,给size里面加上“P2D”,变成size(600,480,P2D);之后视频也不会显示。我想可能是我的显卡驱动的问题吧,因为processing貌似使用的是OpenGL,而ATI的显卡需要安装一些驱动才能对OpenGL有很好的支持。后面这句其实是自己乱说的,并没有去实践,因此只是猜测罢了,不能算作是对的。

本次心得就总结到这里。

附上我的代码:

[cc lang=”java”]

import processing.video.*;
Movie myMovie;

void setup() {
size(600,480);
myMovie = new Movie(this, “bicycle_h264.mov”);
myMovie.loop();
}

void draw() {
//tint(255, 20);
//image(myMovie, mouseX, mouseY);
image(myMovie, 0, 0);
}

// Called every time a new frame is available to read
void movieEvent(Movie m) {
m.read();
}

[/cc]

发表评论

电子邮件地址不会被公开。 必填项已用*标注