Mastering openFrameworks_第五章_使用视频

发布于:2024-09-18 ⋅ 阅读:(14) ⋅ 点赞:(0)

使用视频

使用视频镜头是一种简单的方式来添加动态图层的交互式项目场景。而视频处理是现代计算机视频艺术的基础。本章将涵盖openFrameworks项目中播放、分层和处理视频的基本和高级主题:

播放视频文件

处理视频帧

径向和水平狭缝扫描效果

正在处理来自摄像机的实时视频

视频合成器

使用图像序列

视频基础

视频是当今最有用的动态媒体容器。它由若干帧ーー移动的图像和声迹ーー全部封装在一个文件中。原则上,每个视频都可以用一系列单独的图像文件表示,用于每个帧和音频文件表示。但是使用一个单一的文件往往更舒适。

注意:使用单个视频文件的最大优点是,现代视频编解码器可以显著减少视频文件的大小相比,图像序列的大小加上配乐文件的大小。此外,解码视频可以更容易地使用GPU而不是CPU。这两个原因使得使用openFrameworks可以流畅地、高帧率地播放高清视频。然而,在使用图像序列部分,我们将看到当使用图像序列比使用一个单一的视频文件更合适。

最著名的视频文件格式是AVI、MP4和MOV。所有这些格式都在openFrameworks中支持,但是通常最好使用MOV格式,因为openFrameworks使用AppleQuickTimeSDK在Macosx和Windows中播放视频,而MOV格式是QuickTime的本地格式。

注意:要在Windows的openFrameworks中播放视频,你需要安装QuickTimehttp://www.apple.com/QuickTime/download/。

如果你想使用youtube.com或vimeo.com这样的网站上的视频,你可以通过keepvid.com这样的网站下载。在使用这些视频时,要小心考虑被许可方的限制。

如果您使用视频编辑器(如AdobeAfterEffects)或3d软件(如Autodesk3DSMax)创建视频文件,那么在保存视频文件时应该注意选择正确的编解码器。下面是可能的用法和相应的编解码器列表:

1.如果你想像普通视频一样播放视频,不改变速度,不使用alpha通道,最好的选择是使用一些MPEG4编解码器(比如h.264),在编解码器中设置大质量值。它将有一个良好的质量和一个小的文件大小。在使用高清视频的情况下,这种编解码器可能是至关重要的,因为使用其他编解码器可以提供一个巨大的文件,这是很难从磁盘实时读取的。

请记住,MPEG4编解码器执行“deep”视频压缩,并使用许多以前的帧来解码一个新帧;因此改变播放此类视频的方向和速度可能会对应用程序的性能产生负面影响。

2.如果你想使用视频作为视频剪辑的VJ-ing,考虑使用编解码器与(苹果)运动-jpeg。

3.如果你需要一个带有alpha通道的视频,可以使用Apple-PNG格式并设置Millions+的颜色或32位的彩色模式。使用这个设置,当使用Motion-JPEG时,文件大小会更大,但是会提供非常好的质量和良好的性能。在写这本书的时候,openFrameworks在使用这些视频的时候是有限的。请参阅使用图像序列部分的细节。

注意:对于使用不同编解码器的MOV文件编码视频,您可以使用

Adobepremiere.如果你在Mac os x中工作,你可以使用简单而免费

的Squared 5的MPEG streamclip工具。

如果您喜欢使用命令行,这是视频的最佳选择转换是开源工具ffmpeg。

播放视频文件

openFrameworks的ofVideoPlayer类用于播放和控制视频。视频对象的基本用法如下:

1.正在加载视频文件,指定其名称:

video.loadMovie( "video.mov" );

2.开始播放视频:

video.play();

3.解码需要显示的帧并播放相应的声音块(最好在testApp::update()中调用它):

video.update();

4.绘制当前视频帧:

video.draw( x, y ); 
or 
video.draw( x, y, w, h );

在绘制视频帧时,可以将当前视频帧视为ofImage对象的序号。因此,您可以使用video.width、video.height值并使用video.setAnchorPercent(percentX,percentY)、video.setAnchorPoint(x,y)和video.resetAnchor()设置锚点。

下面的例子展示了ofVideoPlayer的基本用法。它基于openFrameworks中的一个emptyExample项目。在运行之前,将handsTrees.mov文件复制到项目的bin/data文件夹中。

注意:这是示例05-video/01-videoplayback。

在testApp.h文件中,在testApp类声明中,添加以下行

视频播放器对象视频声明:

ofVideoPlayer video; //Declare the video player object

在testApp.cpp文件中,填充setup()、update()和draw()的函数

以下列方式运作:

void testApp::setup(){ 
video.loadMovie( "handsTrees.mov" ); //Load the video file 
video.play(); //Start the video to play 
 } 
void testApp::update(){ 
video.update(); //Decode the new frame if needed 
}
 void testApp::draw()
{ 
ofBackground( 255, 255, 255 ); //Set white background 
ofSetColor( 255, 255, 255 ); 
video.draw( 0, 0 ); //Draw the current video frame 
}

当你运行代码的时候,你会看到屏幕上正在播放电影:

请注意,默认情况下,ofVideoPlayer播放视频的速度基于时间数据,独立于您的应用程序呈现速率。例如,如果您通过调用ofSetFrameRate(60)将应用程序帧速率设置为60,但是视频的帧速率为30fps,那么video.update()将以30帧速率切换帧速率,而不是60fps。所以知道这个框架是否是新的是很有用的。这些信息可以通过布尔函数视频获得,如果在上一次视频更新调用期间加载了一个新帧,那么返回true。请参见“替换颜色示例”部分中使用video.isFrameNew()函数的示例,以及以下部分中给出的其他示例。

控制视频播放

在ofVideoPlayer中还有一些控制视频播放和定位的附加功能:

1.Stop()函数用于停止播放视频。

2.setPaused(bPause)函数设置/重置视频播放的暂停,其中bPause有bool类型。如果暂停视频,仍然可以使用setFrame()或setPosition()函数切换其帧。这是非常有用的精确帧数控制。

3.setPosition(pos)函数设置文件中的播放位置,其中pos位于

范围[0,1]中的一个浮点数。

4.setFrame(frame)函数将当前帧设置为帧,其中帧是从0到视频的video.getTotalNumFrames()-1的整数值。

5.getCurrentFrame()函数的作用是:返回当前帧号。

6.getToatalNumFrames()函数的作用是:返回视频中的帧数。

7.getDuration()函数的作用是:以秒为单位返回视频的内部持续时间

作为一个浮点数。

isLoaded()函数如果视频成功加载,isLoaded()函数返回true,这可用于处理文件名中的错误等错误。

9.isPaused()和isPlaying()函数分别在暂停和播放状态时返回bool类型的值

10.getIsMovieDone()函数当视频的最后一帧完成时,getIsMovieDone()函数返回true。。

你可以使用以下功能自由改变播放速度:

11.setSpeed(speed)函数,其中速度是一个浮点值。值1.0表示正常视频速度,值2.0表示双倍速度。负速度向后播放视频;例如,value-1.0意味着以正常速度向后播放。

12.getSpeed()函数返回的浮点值等于当前的运行速度。

请注意,你可以不断地改变速度。这是一个重要的功能,增加逼真的视频背景。例如,如果您正在播放一个旋转磨坊的视频,您可以缓慢地改变视频的速度,以使用柏林噪声模拟风的变化。详情请参阅附录b


网站公告

今日签到

点亮在社区的每一天
去签到