openFrameworks 第四篇:视频
视频是多媒体艺术交互的基础,围绕着视频内容,结合投影机等硬件设备,已经打造出了越来越绚丽夺目的视觉盛宴:全息,3dmapping,大屏幕等,不仅要让你看,而且要想着法让你好看。
一:播放一个视频
二:控制视频的播放
• stop() 停止视频
• setPaused( bPause ) 根据bool值的真假设置暂停或播放。
• setPosition( pos ) pos类型是float型,取值范围[0, 1],设置视频的播放位置。
• setFrame( frame ) 设置具体的某一帧,frame是int型,取值范围是0 to video. getTotalNumFrames() - 1.
• getCurrentFrame() 获取当前帧的数值。
• getTotalNumFrames() 获取视频的总帧数。
• getDuration() 获取视频的总秒数,float类型。
• isLoaded() 判断视频是否加载成功。
• isPaused() and isPlaying() 判断是暂停状态或播放状态。
• getIsMovieDone()判断视频播放完毕。
• setSpeed( speed ) 设置视频播放的速率,比如:1.0是正常播放,2.0是快进播放,-1.0是从后到前倒着播放。
• getSpeed() 获取播放速率。
• The setLoopState( state ) 设置视频播放循环状态,有三种。
OF_LOOP_NONE: 播完结束。
OF_LOOP_NORMAL: 播完后,又重新开始循环,这是默认的播放方式。
OF_LOOP_PALINDROME:也是无限循环,前后衔接比NORMAl状态更平滑。
• The getLoopState() 获取当前循环类型。
三:根据视频帧获取像素的颜色
ofPixels pixels = video.getPixelRef(); 获取像素值,然后拷贝存储到pixels中,
推荐使用ofPixels &pixels = video.getPixelRef();使用指针,不用拷贝数据,操作快速,但是获取不到r,g,b数值,画面是黑色的,这个好像是 openFrameworks 0.9.6版本的bug
通过对像素级别的操作,可以改变画面的颜色,排列分布,出现扭曲,拉伸等不同的表现形式。
四:获取实时摄像头
五:利用图片序列帧生成视频
这里引入一个ofxImageSequence插件,加载上面的骑马图片序列帧,运行后可以看到一个骑马的动态视频。
各个框架实现原理不尽相同,但我想最基本的逻辑是相通的,像Qt里是用定时器播放一张张序列帧图片,根据定时器和播放序列帧的速度,可以调节视频的快慢。
在实际工程开发中,用序列帧代替原始视频的一个最大好处是,可以用png做成背景透明的视频叠加在其他的界面上,而不至于有黑色的底框。