うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】VideoPlayer で動画をストリーミング再生する

あらまし

Unity 5.6 以降動画再生用のライブラリとして VideoPlayer が導入された
ローカルファイルから動画再生ができることは知っていたが、
ストリーミング再生ができるか公式に記述が無かったため調査してみた
※ 英語なので見逃している可能性がある
Video.VideoPlayer - Unity スクリプトリファレンス

利用する動画

動画はこちらのサイトのものを利用させていただく
www.home-movie.biz

ローカルの動画を再生

ローカルの動画を再生するなら下記コードでできる

using UnityEngine;
using UnityEngine.Video;
 
public class StreamingVideoPlayer : MonoBehaviour
{
    [SerializeField]
    private VideoPlayer _videoPlayer;
 
    private void Awake()
    {
        _videoPlayer.playOnAwake = false;
        _videoPlayer.waitForFirstFrame = true;
        _videoPlayer.renderMode = VideoRenderMode.CameraFarPlane;
        _videoPlayer.targetCamera = Camera.main;
        _videoPlayer.Play();
    }
}

ストリーミング再生

ストリーミング再生を行うためには sourceVideoSource.Url に変更して url に .mp4 のリンクを指定する
※拡張子が mp4 以外のファイルではストリーミング再生ができないので注意

PreparePlay を同時に呼び出すか、prepareCompleted が呼ばれたタイミングで
Play を呼ぶ事でストリーミング再生を行える

もし Prepare のみ呼び出した場合動画のロードを待ってから再生を自動的に行う

f:id:hacchi_man:20200122001838g:plain

using UnityEngine;
using UnityEngine.Video;
 
public class StreamingVideoPlayer : MonoBehaviour
{
    private VideoPlayer _videoPlayer;
 
    private void Awake()
    {
        _videoPlayer = gameObject.AddComponent<VideoPlayer>();
 
        // ロードするまで再生させないため  false
        _videoPlayer.playOnAwake = false;
        // 最初のフレームのロード待ち
        _videoPlayer.waitForFirstFrame = true;
        // ビデオをurl からロードする
        _videoPlayer.source = VideoSource.Url;
        _videoPlayer.url = "https://www.home-movie.biz/mov/hts-samp003.mp4";
  
        // カメラにの背面に表示する
        _videoPlayer.renderMode = VideoRenderMode.CameraFarPlane;
        // カメラをセット
        _videoPlayer.targetCamera = Camera.main;
  
        _videoPlayer.prepareCompleted += VideoPlayerOnPrepareCompleted;
        // 動画ロードを開始
        _videoPlayer.Prepare();
    }
 
    private void VideoPlayerOnPrepareCompleted(VideoPlayer source)
    {
        // Prepare の Completed 時にPlay を同時に呼ぶことでストリーミング再生を行う
        source.Play();
    }
}