Unityで動画再生（VideoPlayer、AVProVideo）

#概要
Unityのバージョンは2019.3

Unityで動画再生をするためのメモです。
標準コンポーネントの VideoPlayer と Asset の AVProVideo の使い方を説明。

VideoPlayer のコンポーネントの内容はマニュアルを見ると詳しく載っています。
https://docs.unity3d.com/ja/2018.4/Manual/class-VideoPlayer.html

AVProVideo のドキュメントはストアページからダウンロードできます（ただし英語）
https://assetstore.unity.com/packages/tools/video/avpro-video-56355
Assetは各OS向けに安いものも提供されているのでWindowsでしか使わないならそちらWindows版のみ購入した方がいい

#VideoPlayer の使い方
uGUI の RawImage に動画を表示する

- シーンに RawImage を追加して Add Component > Video > Video Player で追加
- Assets で右クリックし Create > Render Texture を作成
- 作成した Render Texture を Raw Image の Texture と Video Player の TargetTexture にアタッチする
- Video Player の Source を選択
 - Asset内のファイルを再生するなら Video Clip を選択して再生するファイルをアタッチする
 - 外部ファイルを再生するなら URL を選択して再生するファイルのパスを指定する
- Play on Awake にチェックを入れると、シーン起動時にビデオ再生を開始
- Loop にチェックを入れると、ビデオ再生を繰り返す

参考ページ
https://xr-hub.com/archives/15798
https://gametukurikata.com/basic/videoplayer
https://goisagi-517.hatenablog.com/entry/2018/12/29/131952

#VideoPlayer のSprict制御
```.cs
  using UnityEngine.Video;

  VideoPlayer video = this.GetComponent<VideoPlayer>();

  // 再生するファイル指定
  video.url = System.Environment.CurrentDirectory + @"\movie\file.mp4";
 
  // 再生時に呼ばれるイベント登録
  video.started += OnStarted;

  // 終了時に呼ばれるイベント登録
  video.loopPointReached += OnLoopPointReached;

  // 再生 
  video.Play();

  // 停止
  video.Stop();


  void OnStarted(VideoPlayer vp)
  {
      Debug.Log("start");
  } 

  void OnLoopPointReached(VideoPlayer vp)
  {
      Debug.Log("End");
  }
```

参考ページ
https://docs.unity3d.com/ja/2018.4/ScriptReference/Video.VideoPlayer.html
https://atsushishi.xyz/2017/12/videoplayer_support/

#AVProVideo の使い方
Display uGUIに動画を表示する

- AVProVideo をインポートして Component > AVPro Video > Media Player で追加
- Media Player の Source Path で Relative To Streaming Assets Folder を ABsolute Path Or URL に変更
 -  ここに再生するファイルパスを指定する
- Auto Open は動画ファイルをスクリプトで指定するのでチェックをはずす
- Auto Play も自動で再生されないようにチェックをはずす
- Canvas の下に空の GameObject を追加して > Add Component > AVPro Video > Display uGUI を追加
- Display uGUI の Media Player にさっき作った Media Player オブジェクトをアタッチ
- Default Texture にテクスチャを指定して No Default Display のチェックをはずす（動画再生してないときのサムネイル表示）

参考ページ
https://qiita.com/neon-izm/items/d2ab9f10341d54e35163
http://www.asset-sale.net/entry/AVPro_Video180506

#AVProVideo のSprict制御
```.cs

  using RenderHeads.Media.AVProVideo;

  MediaPlayer avPro = this.GetComponent<MediaPlayer>();

  // イベントリスナー登録
  avPro.Events.AddListener(OnMediaPlayerEvent);

  // ファイル読み込み
  string path = System.Environment.CurrentDirectory + @"\movie\file.mp4";
  avPro.OpenVideoFromFile(MediaPlayer.FileLocation.AbsolutePathOrURL, path, ture);

  // リトライ
  avPro.Rewind(false);


  void OnMediaPlayerEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode ec)
  {
      switch (et)
      {
          case MediaPlayerEvent.EventType.MetaDataReady:    // 読み込み時のイベント
              // 再生 
              avPro.Play();
              break;
          case MediaPlayerEvent.EventType.FinishedPlaying:    // 再生終了時のイベント
              // 閉じる
              avPro.CloseVideo();
              break;
      }
  }

```

AVProVideoをインポートすると中にサンプルがあるのでこれが参考になる（Demos > Scenes）

参考ページ
https://psychic-vr-lab.com/blog/unity/%E5%85%A8%E5%A4%A9%E7%90%83%E5%8B%95%E7%94%BB%E5%86%8D%E7%94%9F%E7%92%B0%E5%A2%83%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/

#VideoPlayer と AVProVideo の比較

- 軽い動画を再生させるだけなら VideoPlayer だけで十分（パフォーマンスに関しては比較してない）
- 8KやVRの動画再生や字幕つけたりなどやりたいなら AVProVideo が対応しているようなのでこちらを使う方がよさそう