视频播放之Video Player

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 : 可以控制的音频轨道的最大数量
Properties:
aspectRatio:定义视频内容如何被拉伸以填充目标区域
audioOutputMode:视频中嵌入音频的目的地
audioTrackCount:当前配置的数据源中发现的音频轨道的数量
canSetDirectAudioVolume:是否支持当前平台和视频格式的直接输出音量控制。(只读)
canSetPlaybackSpeed:回放速度是否可以改变(只读)
canSetSkipOnDrop:确定VideoPlayer是否跳过帧以赶上当前时间(只读)
canSetTime:当前时间是否可以使用时间或时间框架属性修改(只读)
canSetTimeSource:VideoPlayer的时间来源是否可以改变(只读)
canStep:如果VideoPlayer可以通过视频内容向前推进,返回true(只读)
clip:通过VideoPlayer播放的视频
controlledAudioTrackCount:VideoPlayer将控制的音频轨道数量。其他的将会被消声。最多允许64个音轨。当播放URLS时,不能预先知道实际的音频轨道数量,这就是这个值独立于VideoPlayer之外的原因。
externalReferenceTime:VideoPlayer使用外部时钟的参考时间来修正它的漂移值。
frame:VideoPlayer目前显示的帧索引
frameCount:当前视频内容的帧数
frameRate:帧/秒的帧速率或URL的帧速率(只读)
isLooping:确定VideoPlayer播放到末尾后是否重新播放。
isPlaying:内容是否正在播放(只读)
isPrepared:VideoPlayer是否已经成功的准备好了要播放的内容(只读)
playbackSpeed:基本播放率将会成倍增加的系数
playOnAwake:内容是否会在组件唤醒时(Awake)回放
renderMode:视频内容将会被绘制出来
sendFrameReadyEvents:允许frameReady事件
skipOnDrop:是否允许VideoPlayer跳过帧以赶上当前时间。
source:VideoPlayer用于回放的来源
targetCamera:当VideoPlayer.renderMode被设置为VideoRenderMode.CameraFarPlane或者VideoRenderMode.CameraNearPlane的时候,使用Camera组件绘制。
targetCamera3DLayout:源视频媒体中包含的3D内容类型。
targetCameraAlpha:目标摄像机平面视频的整体透明度水平。
targetMaterialProperty:当VideoPlayer.renderMode设置为Video.VideoTarget.MaterialOverride对应的Material texture属性
targetMaterialRenderer:当VideoPlayer.renderMode设置为Video.VideoTarget.MaterialOverride是对应的目标Renderer
targetTexture:当VideoPlayer.renderMode被设置为Video.VideoTarget.RenderTexture,使用RenderTexture绘制。
texture:防止视频内容的内部texture
time:VideoPlayer当前的时间(秒)
timeReference:VideoPlayer观察并校正漂移的时钟。
timeSource:[还未实现]VideoPlaye使用的源来获取当前时间
url:VideoPlayer读取内容的文件或HTTP URL
waitForFirstFrame:当VideoPlayer.playOnAwake打开时,确定VideoPlayer在回放之前是否会等待一个帧去加载texture。

Public Methods:
EnableAudioTrack:启用/禁用音频轨道解码。只有当VideoPlayer当前没有播放时才会起作用。
GetAudioChannelCount:指定音轨中的音频通道数
GetAudioLanguageCode:返回指定跟踪的语言代码(如果有的话)
GetDirectAudioMute:获取指定音轨的直接输出音频静音状态。
GetDirectAudioVolume:返回指定音轨的直接输出音量
GetTargetAudioSource:获取将接收指定音轨的音频样本的音频源,如果VideoPlayer.audioOutputMode设置为VideoAudioOutputMode.AudioSource.
IsAudioTrackEnabled:返回是否启用指定音频轨道的解码,查看VideoPlayer.EnableAudio音轨与静音的区别。
Pause:暂停回放并保持当前时间不变
Play:开始回放
Prepare:启动回放引擎准备工作
SetDirectAudioMute:为指定的音轨设置直接输出的音频静音状态。
SetDirectAudioVolume:设置指定音轨的直接输出音量
SetTargetAudioSource:设置接收指定音轨样本的AudioSource,如果音频目标选择VideoPlayer.audioOutputMode
StepForward:立即将当前时间提前一帧
Stop:暂停回放,并将当前时间设置为0

Events:
clockResyncOccurred:当VideoPlayer的时钟被同步到它的VideoTimeReference时会被调用
errorReceived:诸如HTTP连接问题之类的错误通过这个回调报告
frameDropped:[没有实现]当视频解码器在回放期间不产生一个帧的时候调用
frameReady:当一个新帧准备好时调用
loopPointReached:当VideoPlayer到达播放内容的末尾时调用
prepareCompleted:当VideoPlayer准备完成时调用
seekCompleted:在一个查找操作完成后调用
started:当播放器被调用时立即被调用

Delegates:
ErrorEventHandler:包含错误信息的VideoPlayer事件的委托类型。
EventHandler:由VideoPlayers发出的所有无参数事件的委托类型。
FrameReadyEventHandler:带有帧数的VideoPlayer事件的委托类型
TimeEventHandler:带有时间位置的VideoPlayer事件的委托类型

Inherited Members:
enabled:激活的Behaviours被更新,不激活的Behaviours不更新
isActiveAndEnabled:这种行为是否已经被调用了
gameObject:这个组件被附加到的游戏对象
tag:这个游戏对象的标签
transform:这个游戏对象附加的Transform
hideFlags:这个对象是否应该被隐藏,保存在场景中还是由用户修改?
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();
        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();
        var audioSource = gameObject.AddComponent();
        videoPlayer.playOnAwake = false;
        videoPlayer.clip = videoClip;
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.MaterialOverride;
        videoPlayer.targetMaterialRenderer = GetComponent();
        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();
            if(vp.isPlaying)
            {
                vp.Pause();
            }
            else
            {
                vp.Play();
            }
        }
    }
}

public class DownloadMovie : MonoBehaviour
{
    void Start()
    {
        var vp = gameObject.AddComponent();
        vp.url = "http://myserver.com/mymovie.mp4";

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

        vp.Play();
    }
}
--------------------- 

原文作者:shiyuedyx
来源:CSDN
原文:https://blog.csdn.net/shiyuedyx/article/details/81170309

你可能感兴趣的:(视频播放之Video Player)