關於VideoPlayer以及使用VUforia播放視頻的見解

Unity5.6.x以後新增了VideoPlayer,可以直接覆蓋物體的Material播放視頻,相比於以前的MovieTexture方便了很多。下邊介紹一下VideoPlayer的一些屬性。

  • Source 可以選擇兩種資源模式,一種就是本地導入的視頻片段,另一種就是URL資源。
  • PlayOnAwake是否在激活腳本的時候播放。
  • WaitForFirstFrame 是否等待第一幀,也就是是不是等一幀再播放視頻。
  • Loop 循環播放。
  • PlaybackSpeed 播放速度。
  • RenderMode 這裏是渲染模式總共有五種,分別是:
    - MaterialOverride:通過重載Material來播放視頻;
    - CameraFarPlane:視頻渲染在相機的最遠端;
    - CameraNearPlane:視頻渲染在相機的最近端;
    - RendererTexture:用於MovieTexture;
    - APIOnly:——–

這裏值得注意的是AudioOutputMode:
- AudioSource:從AudioSource播放音頻,只需要把AudioSource拖進來就可以了,我昨天做一個Demo的時候無法播放聲音,最後用了Premiere把視頻聲音剝離出來以後才播放成功。其實這裏不用,只需要創建一個AudioSource然後放在這裏就可以了。
- None:就是不播放聲音咯。
- Direct:使用這個測試,但是沒有聲音,還需要測試。

VideoPlayer

之後就是比較有技術含量的了。如何在Vuforia中通過追蹤來實現是否播放視頻呢
首先,Vuforia控制追蹤物體的腳本叫做:DefaultTrackableEventHandler。這裏邊有兩個方法,分別叫做:OnTrackingFound()、OnTrackingLost()。這兩個方法在 OnTrackableStateChanged()這個方法中調用。
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
OnTrackingFound();
}
else
{
OnTrackingLost();
}
}

所以我們需要在追蹤到和失去追蹤的時候搞點事情,就要在OnTrackingFound()、OnTrackingLost()這兩個方法裏做了。我們需要在狀態改變調用這兩個方法的時候告訴我們,就需要有事件能夠通知到訂閱者,所以我們在這個類裏邊定義了兩個事件:

public static event Action<bool> Event_OnTrackingFound;
public static event Action<bool> Event_OnTrackingLost;

因爲要判斷是否播放,所以參數應該是bool類型,現在我們需要在TrackingFound和Lost的時候告訴事件的訂閱者。

 if (Event_OnTrackingFound != null)
            {
                Event_OnTrackingFound(false);
            }

此時,我們就需要用拿到的參數來決定視頻是否播放啦。我們需要一個新的類:VideoPlayerController因爲DefaultTrackableEventHandler這個類在Vuforia的名空間下,所以在VideoPlayer中需要引用Vuforia的名空間。下邊附上VideoPlayerController的代碼片供大家參考。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using System;
using Vuforia;
public class VideoPlayerController : MonoBehaviour {

    private VideoPlayer videoPlayer;

    void Awake()
    {
        videoPlayer = this.GetComponent<VideoPlayer>();
        DefaultTrackableEventHandler.Event_OnTrackingFound += HanleTrackFound;
        DefaultTrackableEventHandler.Event_OnTrackingLost += HanleTranckLost;
    }
    void Start()
    {

    }
    private void HanleTrackFound(bool isFound)
    {
        if (isFound)
        {
            videoPlayer.Play();
        }
        else
        {
           videoPlayer.Pause();
        }

    }
    private void HanleTranckLost(bool isLost)
    {
        if (isLost)
        {
            videoPlayer.Pause();
        }

    }
    void OnDestroy()
    {
        DefaultTrackableEventHandler.Event_OnTrackingFound -= HanleTrackFound;
        DefaultTrackableEventHandler.Event_OnTrackingLost -= HanleTranckLost;
    }
}

這樣就實現了,使用Vuforia在掃描到識別物的時候播放視頻,丟失識別物的時候暫停的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章