当前位置: 首页 > news >正文

Mastering openFrameworks_第五章_使用视频

使用视频

使用视频镜头是一种简单的方式来添加动态图层的交互式项目场景。而视频处理是现代计算机视频艺术的基础。本章将涵盖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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 健身管理|基于java的健身管理系统小程序(源码+数据库+文档)
  • 清理.svn文件夹执行命令bat
  • -isystem isystem 实验记录
  • 【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721
  • 赛氪技术支持中医药知识大赛,亮相中国国际服务贸易交易会
  • 1997-2022年各省农用化肥折纯量数据(无缺失)
  • 【Kubernetes】常见面试题汇总(十五)
  • 数据库系统概论(3,4)
  • JDK8的一些主要的新特性
  • 计算机网络(第8版)第三章 数据链路层(3.4)
  • 【C++ Primer Plus习题】16.1
  • Azure web app has no access to openai private endpoint in virtual network
  • AttackGen - AI 网络安全事件响应测试工具,附下载链接
  • 【系统架构师】-论文-2024-2009年系统架构师历年论文题目
  • JavaScript高阶面试题:(第三天)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android Studio:GIT提交项目到远程仓库
  • angular组件开发
  • jdbc就是这么简单
  • Js基础——数据类型之Null和Undefined
  • js继承的实现方法
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • python 装饰器(一)
  • vue 配置sass、scss全局变量
  • vue数据传递--我有特殊的实现技巧
  • Web Storage相关
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 开源地图数据可视化库——mapnik
  • 使用Swoole加速Laravel(正式环境中)
  • 微服务框架lagom
  • 微信支付JSAPI,实测!终极方案
  • 优秀架构师必须掌握的架构思维
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​VRRP 虚拟路由冗余协议(华为)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #stm32整理(一)flash读写
  • #每天一道面试题# 什么是MySQL的回表查询
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • **PHP二维数组遍历时同时赋值
  • .NET Framework 3.5安装教程
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net MySql
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 按比例显示图片的缩略图
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解