Unity流水账2:视频播放之Video Player

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SHIYUEDYX/article/details/81170309

VideoPlayer组件
  使用VideoPlayer组件可以将视频文件附加到GameObjecs,并在运行时,在GameObject的Texture上播放它们。
  默认情况下,Video Player组件的材质属性设置为MainTex,这意味着当VideoPlayer组件附加到具有Renderer的GameObject时,它会自动将自身分配给该Renderer(因为这是GameObject的main Texture)。这里GameObject有一个Mesh.Unity的主要基本图元。Mesh构成3D世界的很大一部分。Unity支持三角形或四角形多边形网格。Nurbs,Nurms,Subdiv曲面必须转换成多边形。Video Player自动将其分配给Renderer字段,这意味着Video Player在Mesh Renderer的Texture上播放。
VideoPlayer
  你还可以为要播放的视频设置特定目标,包含:

·A Camera plane
·A Render Texture
·A Material Texture参数
·组件中的任何Texture字段

  VideoPlayer组件参数设置
VideoPlayer

Source:选择视频的来源类型
参数选择:
1.Video Clip:将Video Clip分配给Video Player。使用Video Clip字段定义分配给VideoPlayer组件的Video Clip.将视频文件拖放到此字段中,或单击该字段右侧的圆圈,然后从Asset中选择它,如果它位于Project文件夹中。
2.URL:通过URL分配视频(例如:http://或者file://).Unity通过URL在运行时读取视频。使用URL字段输入要分配给VideoPlayer的视频URL.可以单击Browse...快速浏览本地文件系统并打开以flie://开头的URL.
Play On Awake:勾选Play On Awake,在Scene启动时播放视频。若想自己控制视频什么时候播放,则不需要勾选。使用Play()命令通过脚本触发它。
Wait For First Frame:如果你勾选Wait For First Frame复选框,Unity会在游戏开始前等待源视频的第一帧准备好显示。如果取消勾选,可能会丢弃前几帧以使视频时间与游戏的其余部分保持同步。
Loop:勾选Loop使Video Player组件在视频播放完后重复播放。如果没有勾选,当视频播放完就会停止播放。
Playback Speed:此滑块和数字字段表示播放速度的乘数,为0到10之间的值。默认设置为1(正常速度)。如果设置为2,视频的播放速度就是正常情况下的两倍。
Render Mode:使用下拉列表定义视频的渲染方式。
参数选择:
1.Camera Far Plane:在Camera's far plane渲染视频。并设置渲染视频的camera,通过Alpha设置全局透明度级别添加到源视频中。这允许通过它可以看到平面后面的元素。
2.Camera Near Plane:在Camera's near plane渲染视频。并设置渲染视频的camera,通过Alpha设置全局透明度级别添加到源视频中。这允许通过它可以看到平面后面的元素。
3.Render Texture:将视频渲染为Render Texture.通过设置Target Texture定义Render Texture组件渲染其图像的“Render Texture”.
4.Material Override:通过Renderer's Material的将视频渲染到GameObject选定的Texture属性中。通过设置Renderer来设置Video Player组件渲染它的图像的Renderer.不设置的话,将使用与Video Player相同GameObject上的Renderer。通过设置Material Property来设置接收Video Player组件图像的材质纹理属性的名称。
5.API Only:将视频渲染到VideoPlayer.texture属性中。你必须使用脚本将纹理指定给其预期目标。
Aspect Ratio:使用相应渲染模式时,填充Camera Near Plane,Camera Far Plane或者Render的图像的宽高比。
参数选择:
1.No Scaling:没有使用缩放。视频以目标矩形为中心。
2.Fit Vertically:缩放视频以垂直适应目标矩形,裁剪左侧和右侧或在必要时在每侧留下黑色区域。视频的横纵比保留。
3.Fit Horzontally:缩放视屏以水平适应目标矩形,裁剪顶部和底部区域或在需要时在上方和下方留下黑色区域。视频的横纵比保留。
4.Fit Inside:缩放视频以适合目标矩形,而不必裁剪。根据需要在左侧和右侧或上方和下放留下黑色区域。视频的横纵比保留。
5.Fit OutSide:缩放视频以适合目标矩形,而不会在左侧和右侧或上方和下放留下黑色区域,根据需要进行裁剪。视频的横纵比保留。
6.Stretch:水平或垂直缩放以适合目标矩形。视屏的横纵比不会保留。
Audio Output Mode:定义如何输出源的音轨。
参数选择:
1.None:音频不播放
2.Audio Source:音频样本被发送到制定的audio sources,从而可以应用Unity的音频处理。
3.Direct:音频样本直接发送到音频输出硬件,绕过unity的音频处理。
Controlled Tracks:视频中的音轨数量。当Source选择URL时才会显示。当Source时Video Clip时,通过检查视频文件来确定轨道数。
Track Enabled:通过勾选相关复选框启用时,相关的音轨用于播放。必须在播放前设置此项。复选框左侧的文本提供有关音轨的信息,特别是曲目编号,语言和频道数。例如在上面的截图中,这个文本是Track 0[und.1 ch].这意味着它是第一首曲目(曲目0),语言未定义(und.),曲目有一个频道(1ch),这意味着它是单声道音轨。当Source是URL时,此信息仅在播放期间可用。仅当source是具有音频(或轨道)的Video Clip,或者你的source是URL(允许你只是在播放期间从URL预期有多少轨道)时,才会显示此属性。
Audio source:指定播放的音轨,可以是Audio Clips。audio source的播放控件(Play On Awake以及Play())不支持video source's audio track;这个属性只有Audio Output Mode设置为Audio Source时才会显示。
Mute:将关联的音轨静音。在Audio Source模式下,使用audio source's的控制。这个属性只有当Audio Output Mode设置为Direct时才会出现。
Volume:关联的音轨的音量。在Audio Source模式下,使用audio source's的音量。这个属性只有当Audio Output Mode设置为Direct时才会显示

Video Clips
  Video Clip是导入的视频文件,Video Player组件使用该文件播放视频内容(如果视频也有声音,则附带音频内容)。视频文件的典型文件扩展名包括.mp4,.mov,.webm和.wmv。当你选择Video Clip时,Inspector显示Video Clip Importer,包括选项,预览和source详细信息。单击预览右上角的Play按钮以播放Video Clip及其第一个音轨。
Video Clip Importer
  要查看Video Clip的信息,点击预览左上角的Video Clip的名称,选择Source Info.
Video Clip
Video Clip
  特定于平台的选项适用于每个目标平台的转码过程,允许为每个平台选择默认选项。
Video Clip
  如果禁用转码,则视频文件将按原样使用,这意味着必须手动验证与目标平台的兼容性(有关详细信息,请参阅视频文件兼容性文档)。但是选择不进行转码可以节省时间与避免相关的质量损失。
Video Clip Importer属性

Importer Version:选择使用哪个Importer Version
参数选择:
1.VideoClip:制作VideoClip,适用于[Video Player组件][class-Video Player]
2.MovieTexture(Legacy):制作Legacy Movie Texture.
Keep Alpha:保留alpha通道并在转码期间对其进行编码,以便即使目标平台本身不支持带alpha的视频也可以使用它。此属性仅对具有Alpha通道的视频可见。
Deinterlace[参考文章4]:控制隔行扫描视频在转码期间如何解除隔行扫描。例如,你可以选择更改隔行扫描设置,基于视频编码方式或者美观原因。隔行扫描视频在每帧中有两个时间样本:一个在奇数行中,一个在偶数行中。
参数选择:
1.Off:视频不是隔行扫描,并且没有处理要做(这是默认设置)
2.Even:采用每个帧的偶数行并插入他们以创建缺少的内容。奇数行被丢弃。
3.Odd:采用每个帧的奇数行并插入他们以创建缺少的内容,偶数行被丢弃。
Flip Horizontally:如果选中此复选框,则在转码期间将视频内容沿水平轴翻转以使其颠倒。
Flip Vertically:如果选中此复选框,则在转码期间沿垂直轴翻转,视频内容左右交换。
Import Audio:如果选中此复选框,则在转码期间导入音轨。此属性仅对具有音轨的视频可见
Transcode:通过勾选复选框启用时,视频将转码为与目标平台兼容的格式。如果禁用,则使用原始内容,绕过可能的冗长的转码过程。
注意:验证源格式是否与每个平台兼容(有关详细信息,请参阅有关视频兼容性的文档)。
Dimensions:控制视频内容大小的调整方式。
参数选择:
1.Original:保持原始尺寸
2.Three Quarter Res:将视频的大小调整为其原始宽度和高度的四分之三
3.Half Res:将视频的大小调整为其原始宽度和高度的一半。
4.Quarter Res:将源的大小调整为原始宽度和高度的四分之一
5.Square(1024*1024):将视频的大小调整为1024*1024的正方形图像。宽高比是可控的。
6.Square(512*512):将视频的大小调整为512*512的正方形图像。宽高比是可控的。
7.Square(256*256):将视频的大小调整为256*256的正方形图像。宽高比是可控的。
8.Custom:将视频的大小调整为自定义分辨率。宽高比是可控的。
Width:目标图像的宽度。当Dimensions设置为Custom时,此属性才可见。
Height:目标图像的高度。当Dimensions设置为Custom时,此属性才可见。
Aspect Ratio:调整图像大小时使用的宽高比控制。仅当Dimensions设置为Original以外的字段时,此属性才可见。
参数选择:
1.No Scaling:根据需要添加黑色区域以保留原始内容的宽高比
2.Stretch:拉伸原始内容以填充目标分辨率,而不会留下黑色区域。
Codec:用于编码视频轨道的编解码器
参数选择:
1.Auto:选择最适合目标平台的视频编解码器。
2.H264:MPEG-4 AVC视频编解码器,在大多数平台上的硬件支持。
3.VP8:VP8视频编解码器,在大多数平台上由软件支持,在一些平台上由硬件支持,如Android和WebGL
Bitrate Mode:相对于所选编码器的基准配置文件,Low,Medium,或者High比特率。
Spatial Quality:此设置决定了视频图像在转码过程中是否缩小了尺寸,这意味着它们占用的存储空间更少。但是调整图像大小也会在播放期间导致模糊。
参数选择:
1.Low Spatial Quality:在转码期间图像的尺寸显著减小(通常为原始尺寸的四分之一),然后在播放的时候扩展回原始尺寸
2.Medium Spatital Quality:在转码期间(通常为原始尺寸的一半),图像的尺寸适度减小,然后在播放的时候扩展回其原始尺寸。虽然有一些调整大小,但图像模糊情况比使用第空间质量选项的好,并且所需的存储空间有所减少。
3.High Spatial Quality:如果选择此选项,则不会调整大小。这意味着在转码期间图像的尺寸不会减小,因此保持了视频原始视觉清晰度。

Video sources
  Video Player组件可以播放从各种来源导入的内容
  1.Video Clip
    要创建和使用Video Clip Asset,你必须先导入视频文件。将视频文件拖放到Project window中会创建一个Video Clip
VideoClip
    创建Video Clip的另一种方法是导航到Asset->Import New Asset以导入视频文件。
    导入后,可以使用Select VideoClip窗口(可通过单击Video Clip字段右侧的圆圈选择按钮访问)或通过将Video Clip Asset拖放到相应的Video Player组件字段来选择新的Video Clip。
VideoClip
  2.URLs
VideoClip
    使用source的下拉菜单将video source设置为URL(默认情况下,此属性设置为Video Clip).将Source设置为URL可以直接使用文件系统中的文件,可以带或不带file://前缀。URL source选项绕过了Asset管理,这意味着你必须手动确保Unity可以找到源视频。例如,Web URL需要Web服务器来托管源视频,而普通文件必须位于Unity可以找到它的地方,用脚本表示。如果内容不在Unity的直接控制之下,或者你希望避免在本地存储大型视频文件,则此功能非常有用。将Video Player组件Source设置为URL也可以通过http://和https://从web source读取视频。在这些情况下,Unity执行必要的预缓冲和错误管理。
  3.Asset Bundle
    Video Clips也可以从Asset Bundle读取。导入后,可以通过将这些Video Clips分配给Video Clip组件的Video Clip字段来使用它们。
  4.Streaming Assets
    置于Unity StreamingAssets文件夹中的文件可以通过Video Player组件的URL选项(参见上文)使用,也可以使用特定平台的路径(Application.streamingAssetsPath).
视频文件的兼容性
  Unity可以导入许多不同格式的视频文件。导入后,视频文件存储为VideoClip asset。但是,这些兼容性因你使用的平台而异。请参阅下表以获取完整兼容性列表。

Windows:.asf,.avi,.dv,.mv4,.mov,.mp4,.mpg,.mpeg,.ogv,.vp8,.webm,.wmv
OSX:.dv,.m4v,.mov,.mp4,.mpg,.mpeg,.ogv,.vp8,.webm,.wmv
Linux:.ogv,.vp8,.webm

  这些格式中的每一种都可以包含具有许多不同[codecs]的轨道。每个平台的每个版本还支持不同的编解码器列表,因此务必查阅正在使用的平台的官方文档。例如:Windows和OSX都提供有关其各自编解码器兼容性的官方文档。有关这些平台的更多兼容性信息,可以参阅Windows和OSX的官方文档。如果编辑器无法读取文件中轨道的内容,则会生成错误信息。如果发生这种情况,你必须进行视频转换或重新进行编码轨道,以便Editor平台的native libraries可以使用它。
  H.264(通常采用.mp4,.m4v或.mov格式)是最佳支持的视频编解码器,因为它提供跨平台的最佳兼容性。通过取消选中Video Clip importer中的Transcode复选框,也可以在不进行转码的情况下使用Video Clips。这使你可以使用视频文件而无需任何额外的转换,这样可以更快,并防止因重新编码而导致质量损失。
  注意:为了获得最佳效果,请务必检查每个目标平台是否支持你的视频文件。
理解视频文件
  视频文件更准确的描述为"containers(容器)".这是因为它们不仅可以包含视频本身,还可以包含其他曲目,包括音频,字幕和其他视频素材。容器中每种类型的轨道也可以有多个,例如:

·多个视点
·音频混合的立体声或5.1版本
·不同语言的字幕
·不同语言的对话

  为了节省带宽和存储,每个轨道的内容使用编解码器进行编码,编解码器根据需要压缩和解压缩数据。
  常见的视频编解码格式是H.264,常见的音频编解码格式是AAC.
  文件扩展名(如.mp4,.mov,.webm或.avi)表示视频文件中的数据是使用某种容器格式排列的。
硬件和软件解码
  大多数现代设备都有专门用于解码视频的硬件。与CPU等相比,该硬件通常比执行该任务需要更少的功率,并且意味着资源可以用于除解码视频之外的任务。这种硬件加速可以通过本机自定义API实现,这些API因平台而异。Unity的视频架构通过提供通用UI和Scripting API来隐藏这些差异,以便访问这些功能。Unity还能够进行基于软件的视频解码。这使用VP8视频编解码器和Vorbis音频解码器,对于平台的硬件解码在分辨率,多个音轨存在或alpha通道支持方面产生不必要限制的情况下非常有用。
视频透明度支持
  Unity的Video Clip和Video Player组件支持alpha。这是用于指代透明度的标准术语。在图形学术语中,alpha是另一种说透明度的方式。Alpha是一个连续值,而不是可以打开或关闭的值。最低的alpha值意味着图像完全透明(根本不可见),而最高的alpha值意味着它完全不透明(图像是实心的,无法透视)。中间值使图像部分透明,允许你同时查看图像和背后的背景。Video Player组件在Camera’s near或 far planes中播放其内容时支持全局Alpha值。视频也可以具有每像素透明度值,这意味着视频图像的透明度可能会有所不同。每像素透明度控制在生成图像和视频的应用程序(如NUKE或After Effects)中完成,而不是在Unity编辑器中完成。
  Unity支持两种具有每像素透明度的视频:
alpha设置

1.Apple ProRes 4444:
Apple ProRes 4444编解码器是Apple ProRes的极高质量版本,适用于4:4:4:4[参考文章8]图像源,包括alpha通道。它提供与源视频相同级别的视觉保真度。Apple ProRes 4444仅在OSX上受支持,因为这是本机可用的唯一平台。它通常出现在.mov文件中。导入使用此编解码器的视频时,通过勾选Video Clip Importer中的相关复选框,启用Transcode以及Keep Alpha。你的操作系统的视频播放软件可能具有识别你的视频使用的编解码器的功能。在转码过程中,Unity将alpha插入颜色流中,因此可以与H.264或VP8一起使用。省略转码操作会将ProRes表示留在资产中,意味着目标平台必须支持此编解码器。此编解码器通常还会生成大文件,从而增加了存储和带宽要求。
2.Webm with VP8:
.webm文件格式具有规范细化,允许它在于VP8视频编解码器结合时本地携带alpha信息。这意味着任何编辑器平台都可以使用此格式读取透明视频。由于Unity支持的大多数平台都使用软件实现来解码这些文件,因此不需要为这些平台进行解码。一个值得注意的例外是Android,该平台的原生VP8支持不包括透明度支持,这意味着必须启用转码,一遍Unity使用其内部alpha表示。

全景视频
  Unity的全景视频功能使你能够:

1.轻松包含360度真实视频。
2.通过包含预渲染的背景视频而不是真实几何体来降低VR中的场景复杂性。

  Unity支持180度和360度视频,采用等距矩形布局(经度和纬度)或立方体贴图布局(6帧)。对于360度的内容,Equirectangular 2D视频的宽高比对应精确为2:1,对于180度的内容应为1:1。
Equirectangular 2D video
  Cubemap 2D视频的宽高比应为1:6,3:4,4:3或6:1具体取决于布局:
Cubemap2Dvideo
  要在UnityEditor中使用全景视频功能,你必须能够访问全景视频剪辑,或者知道如何创作它们。
  此页面描述了在编辑器中显示任何全景视频的以下步骤:

1.设置Video Player以将视频播放到Render Texture.
2.设置接收RenderTexture的Skybox Material
3.将场景设置为使用Skybox Material.

  注意:这是一项资源密集型功能。为获得最佳视觉效果,请以最高分辨率(通常为4K或8K)使用全景视频。大型视频需要更多的计算能力和解码资源。大多数系统对最大视频解码分辨率有特定限制(例如,许多移动设备仅限于HD或2K,而较旧的桌面可能限制为2K或4K).
  1.视频播放器设置
    将视频作为一个Asset导入Unity。要创建Video Player,将视频Asset从Project视图拖动到Unity的Hierarchy视图的空白区域。默认情况下,这会将组件设置为播放默认摄像机的全屏视频。点击Play查看此内容。你应该更改脚本,以便渲染为Render Texture。这样,你可以精确控制它的显示方式。为此,请转到Assets>Create>Render Texture。设置Render Texture的大小以匹配你的视频。要检查视频的尺寸,请在Assets文件夹中选择视频,然后查看Inspector窗口。滚动至Unity预览视频的部分,在预览窗口中选择视频名称,然后将其改为Source Info.接下来,将Render Texture的Depth Buffer设置为No depth buffer.
Render Texture
    现在,打开Video Player Inspector并将Render Mode改为Render Texture.将新的Render Texture从Asset视图拖动到Target Texture插槽。进入Play模式以验证此功能是否正常。视频不会在Game窗口渲染,但是你可以选择Render Texture Asset以查看其内容是否随每个视频帧一起更新。
RenderTexture
  2.创建一个Skybox Material
    你需要将默认的Skybox替换为视频内容,以将全景视频渲染为场景的背景。为此,请创建一个新的Material(Assets>Create>Material)。转到新的Material Inspector并将Material的Shader设置为Skybox/Panoramic(转到Shader>Skybox>Panoramic);将Render Texture从Asset视图拖动到新Material’s Inspector的Texture槽。你必须正确识别视频中的内容类型(cubemap或者equirectangular)才能正确显示全景视频。对于立方体贴图内容(例如交叉和条带布局,如常见的静态Skybox Texture),将Mapping设置为6 Frames Layout。对于equirectangular内容,设置Mapping到Latitude Longitude Layout,然后设置360度或180度子选项。如果视频覆盖整个360度视图,请选择360度选项。如果视频只是一个超前的180度视图,请选择180度。查看Material Inspector底部的Preview。平移并检查内容是否正确。
  3.将全景视频渲染到Skybox
    最后,你必须将新的Skybox材质连接到场景。

(1).打开Lighting窗口(菜单:Window>General>Lighting Setting)
(2).将新的Skybox Material Asset拖放到Environment下的一个插槽中。
(3).按“Play”将视频显示为Skybox上的场景背景。
(4).更改场景摄像机方向以显示Skybox的不同部分(因此显示全景视频的不同部分)

3D全景视频
  在Player Settings中打开Virtual Reality Support(菜单:Edit>Project Settings>Player>XR Settings),特别是你的源视频具有立体声内容。这将解锁Skybox/Panoramic Material中的额外3D Layout选项。3D Layout有三个选项:Side by Side,Over Under和None(默认值).
  如果视频包含左侧的左眼内容和右侧的右眼内容,使用“Side by Side”.如果左右内容在视频中位于彼此的上方和下方,使用Over Under.Unity会检测当前正在渲染的眼睛,并使用单通道立体渲染将此信息发送到Skybox/Pannoramic shader。shader包含当Unity在VR中渲染每只眼睛的内容时基于此信息选择正确的一半视频的逻辑。
3D panoramic video
  对于非360 3D视频(不应使用Skybox材质),使用相机近/远平面渲染模式时,可在视频播放器组件中直接使用相同的3D布局。
cubemap视频的备用Render Texture类型
  使用cubemap视频时,你可以将video player直接渲染到2D Render Texture并保留精确的立方体贴图布局。
  要实现此目的,请将Render Texture Asset’s Dimension从2D更改为Cube,并将Render Textur的尺寸设置为源视频各个面的尺寸。
  例如,如果你有一个尺寸为4096x3072的4x3水平十字形cubemap布局视频,将Render Texture’s的大小设置为1024x1024(4096/4和3072/3).在渲染到Cube Target Texture时,Video Player假定源视频包含十字形或条形布局中的cube map(它使用视频的宽高比确定).然后,Video Player使用正确的正方体面填充渲染纹理的面。使用生成的Render Texture Cube作为天空盒。为此,创建一个Material并将Skybox/Cubmap指定为shader(shader>skybox>cubemap),而不是上面描述的Skybox/Panoramic Material.
视频尺寸和转码
  包含3D内容需要视频的宽度或高度的两倍(对应于Side-by-Side或Over-Under布局)。记住,许多桌面硬件视频解码器仅限于4K分辨率,移动硬件视频解码器通常限制在2K或更低,这限制了在这些平台上实时播放的分辨率。你可以使用视频转码生成较低分辨率版本的全景视频,但要采取预防措施,以避免在左右3D内容之间或者立方体贴图面与相邻黑色区域之间的边缘引入渗色。通常,你应该以二维幂的方式创作视频,并将其转码为其他二维幂,以减少视觉伪影。

VideoPlay代码
  VideoPlayer将视频内容播放到目标上。内容可以是一个导入的VideoClip asset或者是一个类似file://,http://的路径。视频内容将被投影到一个受支持的目标上,例如摄像机背景(Camera background)或者渲染文理(RenderTexture)。如果视频内容是半透明的,那么这个半透明将会表现在目标上,使目标后面的对象可见。
  电影文件支持格式说明:
    VideoPlayer的实现使用原生的音频和视频解码库,使用符合目标平台需求的视频是你的责任。VideoChipImporter提供了一些选项将VideoClip Assets转换为H.264或者VP8视频解码器中的一个,还有一些可以尝试的选项,比如分辨率。这将分别使用音频轨道的匹配解码器:AAC和Vorbis,可以查看VideoClipImporter.SetTargetSettings 以及 VideoImporterTargetSetting.enableTranscoding.
    你可以选择忽略这个转码,而是使用你已经知道的由目标系统支持的视频,使用外部程序对编码过程进行更好的控制。之后VideoClipImporter editor将会提供指导方针和警告,以便更好的帮助指定适当的格式和编码选择。目前,必须遵循供应商的建议,并且在旧的移动平台上受到特别的限制。例如,你在网上找到的视频通常需要检查和操作,才能在运行在多个设备上的游戏中可靠的使用。以下是一些建议和已知的限制:

*Android:支持的媒体格式。请参阅下面附加的注释。
*Windows:H.264视频解码器(见格式约束)
*iPhone6-7:比较iPhone的型号(见TV和Video)

    最好的本地支持的硬件加速视频编解码器是H.264,以及VP8是一种软件解码解决方案,可以在需要时使用。在安卓上,VP8也支持使用本地库,因此可以根据型号对硬件进行辅助。在编码参数中寻找的关键值:

*视频编码解码器(Video Codec):H.264或者VP8
*分辨率(Resolution):例如:1280x720
*分析器(Profile):使用与H.264,Profile是一组功能和约束,供应商经常指定这一点,比如"Baseline"或者"Main",可查看:https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles
*分析级别(Profile level):适用于H.264,在给定的分析器中,级别指定了某些性能需求,例如:“Baseline 3.1”,可查看:https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles
*音频解码器(Audio Codec):典型的AAC(使用H.264的mp4视频)或Vorbis(使用VP8的webm视频)
*音频通道(Audio Channels):取决于平台。例如,安卓推荐的是立体声文件,但许多设备将接受5.1

Android注释:

*在所有设备上都无法支持超过640x360的分辨率。运行时检查是为了验证这一点,而失败将导致电影不被播放。
*对于Jelly Bean/MR1,由于操作系统库中的错误,不能播放超过1280x720或超过2个音轨的电影。
*对于Lollipop和以上,任何分辨率或音频通道的数量都可以尝试,但将受到设备功能的限制。
*Vulkan图形API还不支持
*在adb logcat输出中报告格式兼容性问题,并且总是使用android视频媒体进行预修复。
*还要注意位于Unity的设备上的特定于设备的错误信息:他们对于引擎来说是不可用的,但通常解释了兼容性问题是什么。

Video Player类说明
Static Properties:

controlledAudioTrackMaxCount : 可以控制的音频轨道的最大数量。当从URL播放音频时,预先不知道音轨的数量。用户可以通过VideoPlayer.controlledAudioTrackCount指定受控音轨的数量。其他曲目将被忽略并静音。在这种情况下,VideoPlayer.audioTrackCount将在准备完成后设置为播放期间的实际曲目数。
函数定义:public static ushort controlledAudioTrackMaxCount

Properties:

aspectRatio:定义视频内容如何被拉伸以填充目标区域
函数定义:public Video.VideoAspecRatio aspectRatio;
audioOutputMode:视频中嵌入音频的目的地
函数定义:public Video.VideoAudioOutputMode audioOutputMode;
audioTrackCount:当前配置的数据源中发现的音频轨道的数量.对于URL源,只有在视频准备完成后才会设置。
函数定义:public ushort audioTrackCount;
canSetDirectAudioVolume:是否支持当前平台和视频格式的直接输出音量控制。(只读)
函数定义:public bool canSetDirectAudioVolume.
canSetPlaybackSpeed:回放速度是否可以改变(只读)
函数定义:public bool canSetPlaybackSpeed
canSetSkipOnDrop:确定VideoPlayer是否跳过帧以赶上当前时间(只读).设置为true,以使VideoPlayer能够跳过当前帧以赶上当前播放时间(如果由于某种原因落后于当前时间)。设置为false以确保播放所有帧而不跳过。
函数定义:public bool canSetSkipOnDrop
canSetTime:当前时间是否可以使用时间或时间框架属性修改(只读)。在所有情况下都不支持设置时间。例如,在HTTP直播中设置时间可能没有意义。
函数定义:public bool canSetTime;
canSetTimeSource:VideoPlayer的时间来源是否可以改变(只读).某些播放引擎只能跟随自己的内部时钟。
函数定义:public bool canSetTimeSource
canStep:如果VideoPlayer可以通过视频内容向前推进,返回true(只读)。使用Video.VideoPlayer.StepForwards快进。
函数定义:public bool canStep
clip:通过VideoPlayer播放的视频.VideoPlayer可能同时引用一个clip和URL。最后一个设置具有优先权。
函数定义:public Video.VideoClip clip;
controlledAudioTrackCount:VideoPlayer将控制的音频轨道数量。其他的将会被消声。最多允许64个音轨。当播放URLS时,不能预先知道实际的音频轨道数量,这就是这个值独立于VideoPlayer之外的原因。
函数定义:public ushort controlledAudioTrackCount;
externalReferenceTime:VideoPlayer使用外部时钟的参考时间来修正它的漂移值。仅当VideoPlayer.timeReference设置为VideoTimeReference.ExternalTime时才相关。
函数定义:public double externalReferenceTime;
frame:VideoPlayer目前显示的帧索引.clip的第一帧设置为0,第二帧设置为1,以此类推。
函数定义:public long frame
frameCount:当前视频内容的帧数.注意,可以在播放期间更改frameCount以调整此值。
函数定义;public ulong frameCount;
frameRate:帧/秒的帧速率或URL的帧速率(只读)
函数定义:public float frameRate
isLooping:确定VideoPlayer播放到末尾后是否重新播放。如果设置为false,clip播放到结尾时,将会暂停,不会重新设置时间为clip的开头。
函数定义:public bool isLooping;
isPlaying:内容是否正在播放(只读)。调用VideoPlayer不一定会导致isPlaying变为true.VideoPlayer必须先成功准备内容才能开始播放
函数定义:public bool isPlaying;
isPrepared:VideoPlayer是否已经成功的准备好了要播放的内容(只读)。准备好的VideoPlayer可以立即开始播放相关内容,而不是从头开始播放引起正常延迟,这涉及获取播放资源并预加载部分或全部内容。一旦VideoPlayer.Prepare被调用并且发出了VideoPlayer.prepareCompleted事件,VideoPlayer就会以未准备好(false)开始并准备好(true).调用VideoPlayer.Stop时,改属性将返回false.如果准备失败,可能导致此属性永远不会设置为true.在这种情况下,将通过VideoPlayer.errorReceived事件发送错误描述。
函数定义:public bool isPrepared;
playbackSpeed:基本播放率将会成倍增加的系数.只有当VideoPlayer.canSetPlaybackSpeed为true时才会起作用。设置为2.0,clip的播放速度将达到正常速度的两倍。对负值的支持取决于平台。
函数定义:public float playbackSpeed
playOnAwake:内容是否会在组件唤醒时(Awake)回放
函数定义;public bool playOnAwake
renderMode:视频内容将会被绘制在哪里。在设置VideoPlay时,会自动将其设置为最可能的值。例如,在摄像机上添加VideoPlayer将导致VideoPlayer将其目标初始化为相机的背景。
函数定义:public Video.VideoRenderMode renderMode;
sendFrameReadyEvents:允许frameReady事件。如果设置为true,则在准备绘制帧时将调用在VideoPlayer.frameReady中注册的所有委托。如果设置为false,则不会调用已注册的委托。
函数定义:public bool sendFrameReadyEvents;
skipOnDrop:是否允许VideoPlayer跳过帧以赶上当前时间。只有当canSetSkipOnDrop为true才能设置。
函数定义:public bool skipOnDrop
source:VideoPlayer用于回放的来源.在VideoClip可以同时设置VideoPlayer和URL.这个属性控制将用于播放的内容。设置新clip或URL时,source将自动更改以使关联类型为最新。
函数定义:public Video.VideoSource source;
targetCamera:当VideoPlayer.renderMode被设置为VideoRenderMode.CameraFarPlane或者VideoRenderMode.CameraNearPlane的时候,使用Camera组件绘制。
函数定义:public Camera targetCamera;
targetCamera3DLayout:源视频媒体中包含的3D内容类型。当启用PlayerSettings.virtualRealitySupported后,每个眼睛的渲染将根据此设置对正确的一半视频进行采样。仅在VideoPlayer.renderMode设置为Video.VideoTarget.CameraBackPlane或Video.VideoTarget.CameraFrontPlane时使用。
函数定义:public Video.Video3DLayout targetCamera3DLayout;
targetCameraAlpha:目标摄像机平面视频的整体透明度水平。取值范围是[0.0,1.0],用于嵌入视频帧中的透明度。
函数定义:public float targetCameraAlpha;
targetMaterialProperty:当VideoPlayer.renderMode设置为Video.VideoTarget.MaterialOverride对应的Material texture属性.视频将发送到Renderer中具有texture属性的每个Material.
函数定义:public string targetMaterialProperty;
targetMaterialRenderer:当VideoPlayer.renderMode设置为Video.VideoTarget.MaterialOverride是对应的目标Renderer.将此设置为null,会导致VideoPlayer使用当前的GameObject的第一个Renderer.
函数定义:public Renderer targetMaterialRenderer;
targetTexture:当VideoPlayer.renderMode被设置为Video.VideoTarget.RenderTexture,使用RenderTexture绘制。如果RenderTexture是TextureDimension.Tex2D,则视频帧将直接绘制到此目标中。为获得最佳性能,RenderTexture.width和RenderTexture.height应完全匹配视频媒体的性能。如果RenderTexture是TextureDimension.Cube,则视频帧将基于视频宽高比在4个支持的布局之一(交叉或条带布局的水平或垂直方向)中展示立方体贴图。视频帧的立方体贴图面将绘制到RenderTexture的6个面。对于一对一像素映射,RenderTexture.width和RenderTexture.height应匹配视频媒体立方体贴图中包含的各个面的大小(例如,对于2048x1536水平十字立方体贴图视频,RenderTexture立方体大小应设置为512x512).
函数定义:public RenderTexture targetTexture;
texture:放置视频内容的内部texture。纹理用于将视频内容发送到所需目标。当VideoPlayer.renderMode设置为[[Video.VideoTarget.APIOnly]时,仍然可以使用此属性从脚本访问内容。
函数定义:public Texture texture;
time:VideoPlayer当前的时间(秒)
函数定义:public double time;
timeReference:VideoPlayer观察并校正漂移的时钟。
函数定义:public Video.VideoTimeReference timeReference;
timeSource:[还未实现]VideoPlaye使用的源来获取当前时间
函数定义:public Video.VideoTimeSource timeSource;
url:VideoPlayer读取内容的文件或HTTP URL。如果同时设置了clip和URL,则最后一个设置将优先使用。文件URL是在平台上或相对于编辑器根目录的绝对文件系统路径。
函数定义:public string url;
waitForFirstFrame:当VideoPlayer.playOnAwake打开时,确定VideoPlayer在回放之前是否会等待一个帧去加载texture。在此模式下,只有在完成VideoPlayer准备并且第一帧在纹理存储器中可用时,才会开始绘制到目标。否则,即使帧没有准备好,也会立即开始播放,导致可能跳过前几帧。
注意:根据准备工作所需的时间和底层平台功能,在准备完成后赶上当前时间可能会导致许多帧被连续跳过。
函数定义:public bool waitForFirstFrame;

Public Methods:

EnableAudioTrack:启用/禁用音频轨道解码。只有当VideoPlayer当前没有播放时才会起作用。禁用音轨有助于完全禁用音频解码,从而节省处理资源。这与在播放期间使轨道静音不同,后者将音轨音量调为0,但仍然对音频样本进行解码。
函数定义:public void EnableAudioTrack(ushort trackIndex,bool enabled);
函数参数:
1.trackIndex:要启用/禁用的音轨索引
2.enable:如果启用该轨道,则为True。禁用则为false
GetAudioChannelCount:指定音轨中的音频通道数
函数定义:public ushort GetAudioChannelCount(ushort trackIndex);
函数参数:trackIndex:正在查询的音轨的索引。
函数返回值:ushort:音频通道数
GetAudioLanguageCode:返回指定跟踪的语言代码(如果有的话)
函数定义:public string GetAudioLanguageCode(ushort trackIndex)
GetDirectAudioMute:获取指定音轨的直接输出音频静音状态。
函数定义:public bool GetDirectAudioMute(ushort trackIndex)
GetDirectAudioVolume:返回指定音轨的直接输出音量
函数定义:public float GetDirectAudioVolume(ushort trackIndex)
函数参数:trackIndex:要查询音量的音轨索引
函数返回值:float:音量,值在0~1之间
GetTargetAudioSource:获取将接收指定音轨的音频样本的音频源,如果VideoPlayer.audioOutputMode设置为VideoAudioOutputMode.AudioSource.
函数定义:public AudioSource GetTargetAudioSource(ushort trackIndex)
函数参数:trackIndex:需要AudioSource的音轨索引
函数返回值:AudioSource:与音频轨道关联的源。
IsAudioTrackEnabled:返回是否启用指定音频轨道的解码,查看VideoPlayer.EnableAudio音轨与静音的区别。
函数定义:public bool IsAudioTrackEnabled(ushort trackIndex)
函数参数:trackIndex:正在查询的音轨索引
函数返回值:bool:如果启用了对指定音轨的解码,则为true.
Pause:暂停回放并保持当前时间不变
函数定义:public void Pause();
Play:开始回放.如果尚未完成准备,则启动准备,在这种情况下,播放不会立即开始。
函数定义:public void Play();
Prepare:启动回放引擎准备工作。准备工作包括保留播放所需资源,以及预加载要播放的部分或全部内容。完成此操作后,可以立即接受帧。
函数定义:public void Prepare();
SetDirectAudioMute:为指定的音轨设置直接输出的音频静音状态。
函数定义:public void SetDirectAudioMute(ushort trackIndex,bool mute);
函数参数:
1.trackIndex:需要设置静音的轨道索引
2.mute:静音开/关
SetDirectAudioVolume:设置指定音轨的直接输出音量
函数定义:public void SetDirectAudioVolume(ushort trackIndex,float volume)
函数参数:
1.trackIndex:需要设置音量的轨道索引
2.volume:新的音量,值范围[0,1]
SetTargetAudioSource:设置接收指定音轨样本的AudioSource,如果音频目标选择VideoPlayer.audioOutputMode
函数定义:public void SetTargetAudioSource(ushort trackIndex,AudioSource source);
函数参数:
1.trackIndex:与指定的AudioSource关联的音轨索引
2.source:与音频轨道关联的AudioSource
StepForward:立即将当前时间提前一帧
函数定义:public void StepForward();
Stop:暂停回放,并将当前时间设置为0
函数定义:public void Stop();

Events:

clockResyncOccurred:当VideoPlayer的时钟被同步到它的VideoTimeReference时会被调用.TimeEventHandler中提供了新的VideoPlayer时间。
errorReceived:诸如HTTP连接问题之类的错误通过这个回调报告
frameDropped:[没有实现]当视频解码器在回放期间不产生一个帧的时候调用
frameReady:当一个新帧准备好时调用。这可能会对CPU造成负担,因此必须通过frameReadyEventsEnable属性显式启用此回调。
loopPointReached:当VideoPlayer到达播放内容的末尾时调用。如果loop属性设置为true,则会发生循环。否则VideoPlayer将停止。
prepareCompleted:当VideoPlayer准备完成时调用。在调用此回调后开始播放时,帧将立即可用。
seekCompleted:在一个查找操作完成后调用。通过更改time或者timeFrames属性来完成搜索操作。根据编解码器性能和在编码时选择的参数,查找持续时间可能明显很长。
started:当播放器被调用时立即被调用。播放引擎准备(如果尚未完成)将在调用后立即开始。

Delegates:

ErrorEventHandler:包含错误信息的VideoPlayer事件的委托类型。
函数定义:public delegate void ErrorEventHandler(Video.VideoPlayer source,string message);
函数参数:
1.source:发出事件的VideoPlayer
2.message:描述刚遇到的错误的消息
EventHandler:由VideoPlayers发出的所有无参数事件的委托类型。
函数定义:public delegate void EventHandler(Video.VideoPlayer source);
函数参数:source:发出事件的VideoPlayer
FrameReadyEventHandler:带有帧数的VideoPlayer事件的委托类型
函数定义:public delegate void FrameReadyEventHandler(Video.VideoPlayer source,long frameIdx);
函数参数:
1.source:发出事件的VideoPlayer
2.frameNum:VideoPlayer现在的帧数
TimeEventHandler:带有时间位置的VideoPlayer事件的委托类型
函数定义:public delegate void TimeEventHandler(Video.VideoPlayer source,double seconds);
函数参数:
1.source:发出事件的VideoPlayer
2.seconds:时间位置

Inherited Members:

enabled:激活的Behaviours被更新,不激活的Behaviours不更新
函数定义:public bool enabled;
isActiveAndEnabled:Behaviour是否已启用调用,启用时为true,禁用时为false
函数定义:public bool isActiveAndEnabled;
gameObject:这个组件被附加到的游戏对象
函数定义:public GameObject gameObject;
tag:这个游戏对象的标签。标签可用于识别游戏对象。在使用标签之前必须在Tags和Layers管理器中声明标签。
注意:你不应该在Awake或OnValidate方法设置标签。这是因为组件调用awake的顺序是不确定的,因此可能导致意外行为,例如标记在awake时被覆盖。如果你尝试这样做,Unity将生成警告"在Awake,CheckConsistency或OnValidate期间无法调用SendMessage。
函数定义:public string tag;
transform:这个游戏对象附加的Transform
函数定义:public Transform transform;
hideFlags:这个对象是否应该被隐藏,保存在场景中还是由用户修改?
函数定义:public HideFlags hideFlags;
name:这个对象的名字.Components与GameObject以及所有附加组件共享相同名字。如果一个类派生自MonoBehaviour,它将从MonoBehaviour继承"name“字段。如果此类也附加到GameObject,则"name"字段将设置为该GameObject的名称。
函数定义:public string name;

Public Methods

BroadcastMessage:在这个游戏对象或者任何它的孩子节点的每一个MonoBehaviour调用叫这个方法名的函数
CompareTag:这个游戏对象是带标签的吗?
GetComponent:如果游戏对象有附加这个类型的组件,就返回这个组件,否则返回null
GetComponentChildren:通过深度优先搜索返回GameObject或者任何他的子节点的这个类型的组件
GetComponentInParent:返回GameObject或者他的父节点的这个类型的组件
GetComponents:返回GameObject所有这个类型的组件
GetComponentsInChildren:返回GameObject或者任何他的子节点的所有这个类型的组件
GetComponentsInParent:返回GameObject或者任何他的父节点的所有这个类型的组件
SendMessage:调用GameObject上每一个MonBehaviour中叫这个名字的函数被调用
SendMessageUpwards:调用GameObject的每一个MonoBehaviour以及它的父类中叫这个名字的函数
GetInstanceID:返回对象的实例id
ToString:返回这个对象的名字

Static Methods

Destroy:移除gameObject,component或者asset
DestroyImmediate:立即销毁对象obj,强烈建议使用Destroy来代替
DontDestroyOnLoad:使对象目标在加载新场景时不被自动销毁
FindObjectOfType:返回第一个被激活加载的对应类型的对象
FindObjectsOfType:返回所有激活加载的对应类型的对象列表

Operators

bool:对象是否存在
operator != 比较两个对象引用是否指向一个不同的物体
operator == 比较两个对象引用,看他们是否引用相同的对象

例子展示:

using UnityEngine;

public class VideoPlayerTest : MonoBehaviour {

	// Use this for initialization
	void Start () {
        GameObject camera = GameObject.Find("Main Camera");
        var videoPlayer = camera.AddComponent<UnityEngine.Video.VideoPlayer>();
        videoPlayer.playOnAwake = false;
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.CameraNearPlane;
        videoPlayer.targetCameraAlpha = 0.5F;
        videoPlayer.url = "C:/Users/xxx/Desktop/test/Assets/StreamingAssets/Video/test.mp4";
        videoPlayer.frame = 100;
        videoPlayer.isLooping = true;
        videoPlayer.loopPointReached += EndReached;
        videoPlayer.Play();
    }
    void EndReached(UnityEngine.Video.VideoPlayer vp)
    {
        Debug.Log("this is endReached>>>>>>>>>>>>>>>>>> ");
        vp.playbackSpeed = vp.playbackSpeed / 10.0F;
    }
}
using UnityEngine;

public class VideoPlayerTest : MonoBehaviour {
    public UnityEngine.Video.VideoClip videoClip;
	// Use this for initialization
	void Start () {
        var videoPlayer = gameObject.AddComponent<UnityEngine.Video.VideoPlayer>();
        var audioSource = gameObject.AddComponent<AudioSource>();
        videoPlayer.playOnAwake = false;
        videoPlayer.clip = videoClip;
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.MaterialOverride;
        videoPlayer.targetMaterialRenderer = GetComponent<Renderer>();
        videoPlayer.targetMaterialProperty = "_MainTex";
        videoPlayer.audioOutputMode = UnityEngine.Video.VideoAudioOutputMode.AudioSource;
        videoPlayer.SetTargetAudioSource(0, audioSource);
    }
    private void Update()
    {
        if(Input.GetButtonDown("Jump"))
        {
            UnityEngine.Video.VideoPlayer vp = GetComponent<UnityEngine.Video.VideoPlayer>();
            if(vp.isPlaying)
            {
                vp.Pause();
            }
            else
            {
                vp.Play();
            }
        }
    }
}
public class DownloadMovie : MonoBehaviour
{
    void Start()
    {
        var vp = gameObject.AddComponent<VideoPlayer>();
        vp.url = "http://myserver.com/mymovie.mp4";

        vp.isLooping = true;
        vp.renderMode = VideoRenderMode.MaterialOverride;
        vp.targetMaterialRenderer = GetComponent<Renderer>();
        vp.targetMaterialProperty = "_MainTex";

        vp.Play();
    }
}

参考文章:
1.https://docs.unity3d.com/2018.2/Documentation/ScriptReference/Video.VideoPlayer.html
2.https://blog.csdn.net/owen7500/article/details/47334929
3.https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles
4.https://blog.csdn.net/xiaojun111111/article/details/70255048
5.https://baike.baidu.com/item/ASF/3918?fromtitle=ASF视频格式&fromid=181577
6.https://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html
7.https://blog.csdn.net/sunnylgz/article/details/7676340
8.https://www.cnblogs.com/xkfz007/archive/2012/07/31/2616806.html
9.https://docs.unity3d.com/Manual/VideoPanoramic.html

猜你喜欢

转载自blog.csdn.net/SHIYUEDYX/article/details/81170309