首页 > 其他分享 >Mastering openFrameworks_第五章_使用视频

Mastering openFrameworks_第五章_使用视频

时间:2024-09-14 11:21:35浏览次数:11  
标签:视频 函数 编解码器 使用 openFrameworks 第五章 video Mastering 播放

使用视频

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

标签:视频,函数,编解码器,使用,openFrameworks,第五章,video,Mastering,播放
From: https://blog.csdn.net/qq_34800671/article/details/142205952

相关文章

  • 第五章 Web开发:基础Web开发的支持
    学习目标5.1前期准备5.2控制器开发5.2.1JSON的支持5.2.2RESTful的支持5.2.2.1什么是RESTful5.2.2.2SpringBoot对RESTful的支持5.2.3Web测试的支持5.3视图(JSP)开发5.3.1整合JSP5.3.1.1项目结构5.3.1.2配置文件5.3.1.3引入依赖包5.3.1.4编写LoginContr......
  • Python第五章节——函数
    函数是组织好的,可重复使用的,用来实现特定功能的代码段一.自定义my_len函数实现对字符串中字符数量的统计二.函数的定义1.定义方式:def函数名(传入参数):    函数体    return返回值2.调用方式:函数名(参数)注意:1.如果不需要参数,那么可以对其进......
  • 【CSS in Depth 2 精译_028】第五章 网格布局 + 5.1 构建基础网格
    当前内容所在位置(可进入专栏查看其他译好的章节内容)第一章层叠、优先级与继承(已完结)1.1层叠1.2继承1.3特殊值1.4简写属性1.5CSS渐进式增强技术1.6本章小结第二章相对单位(已完结)2.1相对单位的威力2.2em与rem2.3告别像素思维2.4视口的相对单位2.5......
  • 无线通信基础第五章信道容量
    AWGN信道容量定义:存在一个最大的速率,称为信道的容量。如果一个信道尝试用超过信道容量的信息传输速率,那么出错概率就一定大于零。AWGN信道: 重复编码(RepetitionCoding)对于一个BPSK符号  ,出错概率为 .将BPSK符号重复编码N次,对应的两个码字分别为  和 如果发送的的......
  • c++primer第五章循环和关系表达式学习笔记
    for循环简单for循环#include<iostream>usingnamespacestd;intmain(){//5.1inti;for(i=0;i<5;i++)cout<<"C++knowsloops.\n";cout<<"C++knowswhentostop.\n";return0;}for循环组成部分#......
  • 第五章,java超市会员管理系统(后端)
    高级编程第五章,java超市会员管理系统(后端)一,项目概述本项目旨在开发一个超市会员管理系统,帮助超市管理会员信息、积分、优惠活动等。系统将提供用户友好的界面,方便超市员工进行日常操作。二,功能需求积分积累积分兑换查询剩余积分开卡(送100积分)退出系统三,实现分......
  • c语言第五章循环1.0
    #define_CRT_SECURE_NO_WARNINGS循环结构例1.11到100求和#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){   intsum=0;   for(inti=1;i<=100;i++){      sum=sum+i;   }   printf("%d",sum);   return......
  • 青少年编程与数学 01-010 青少年成长管理 第五章 资源 2_2 成长资源
    青少年编程与数学01-010青少年成长管理第五章资源2_2成长资源第二节成长资源一、什么是成长资源二、成长资源的分类三、教育资源四、媒体资源五、情感资源六、物质资源分类七、社交资源八、文化资源九、环境资源十、健康资源十一、机会资源十二、资源的利用(一)儿童......
  • 【北京迅为】《stm32mp157开发板嵌入式linux开发指南》第五章 Ubuntu使用apt-get下载
         iTOP-STM32MP157开发板是基于意法半导体STARM双Cortex-A7核加单Cortex-M4核的一款多核异构处理器。Cortex-A7内核提供对开源操作系统Linux的支持,借助Linux系统庞大而丰富的软件组件处理复杂应用。M4内核上运行对于实时性要求严格的应用。         开......
  • Opencv第五章——几何变换
    1. 缩放我们可以通过OpenCV提供的resize()方法实现随意更改图像的大小比例,语法格式如下:dst=cv2.resize(src,dsize,fx,fy,interpolation)参数说明:src:原始图像dsize:输出图像的大小,格式为(宽,高),单位为像素fx:可选参数,水平方向上缩放比例fy:可选参数,竖直方向......