Closed6

【Unity】サーバー経由で動画を取り込んで、VideoPlayerで再生する方法の調査

スタジオしまづスタジオしまづ

以下のコードから試したけど、問題なく再生される。。。

using UnityEngine;
using UnityEngine.Video;

public class TestVideoPlayer : MonoBehaviour
{
    string url = "ここにurlを入れる"; //

    void Start()
    {
        PlayVideo();
    }

    void PlayVideo()
    {
        VideoPlayer videoPlayer = GetComponent<VideoPlayer>();
        videoPlayer.source = VideoSource.Url;
        videoPlayer.url = url;
        videoPlayer.Play();
    }
}

んじゃ、firebaseのurlがおかしかったのか?

スタジオしまづスタジオしまづ

行けた!
動画がmp4じゃなくて、mov形式だったのが問題っぽい。

mov形式にしてもう一度やってみよ

スタジオしまづスタジオしまづ

いや。。。mov形式でも行けた。。。
原因はファイル名だったっぽい。

2021-06-16 19-04-10.mov

を以下に変えたら行けたわw

videoPlayerTest.mov
スタジオしまづスタジオしまづ

firebaseのストレージを使ったコード
雑ですみませんがこんな感じ(ここまでにfirebaseの設定がいる)。

using System.Collections;
using UnityEngine;
using Firebase.Auth;
using Firebase.Storage;
using System;

using UnityEngine.UI;
using UnityEngine.Video;

public class Hogehoge : MonoBehaviour
{

    [SerializeField] RawImage _image;
    [SerializeField] VideoPlayer _videoPlayer;

    [SerializeField] string firebaseURL;
    [SerializeField] string videoName;

    FirebaseStorage storage;

    void Start()
    {
        StartCoroutine(ShowDownloadUrl());
    }

    IEnumerator ShowDownloadUrl()
    {
        FirebaseAuth auth = FirebaseAuth.DefaultInstance;

        // firebaseの匿名認証
        yield return auth.SignInAnonymouslyAsync().ContinueWith(tt => {
            if (tt.IsCanceled)
            {
                Debug.LogError("SignInAnonymouslyAsync was canceled.");
                return;
            }
            if (tt.IsFaulted)
            {
                Debug.LogError("SignInAnonymouslyAsync encountered an error: " + tt.Exception);
                return;
            }

            FirebaseUser newUser = tt.Result;
            Debug.LogFormat("User signed in successfully: {0} ({1})",
                newUser.DisplayName, newUser.UserId);
        });

        // TODO:ほんとはfirebaseの匿名認証完了したらだけど面倒だから0.3秒後に実行
        yield return new WaitForSeconds(0.3f);
        // 動画のuriを取得
        storage = FirebaseStorage.GetInstance(firebaseURL);
        StorageReference path_reference = storage.GetReference(videoName);

        var task = path_reference.GetDownloadUrlAsync();

        // TODO:上の同じく面倒だから2秒後
        yield return new WaitForSeconds(2f);
        if (!task.IsFaulted && !task.IsCanceled)
        {
            Debug.Log("Download URL: " + task.Result);
            Uri uri = task.Result;
            // 再生
            Load(uri);
        }
        Debug.Log("終わり");
    }

    // 再生
    void Load(Uri uri)
    {
        _videoPlayer.playOnAwake = false;
        // 最初のフレームのロード待ち
        _videoPlayer.waitForFirstFrame = true;
        _videoPlayer.source = VideoSource.Url;
        _videoPlayer.url = uri.ToString();

        _videoPlayer.renderMode = VideoRenderMode.CameraFarPlane;
        // カメラをセット
        _videoPlayer.targetCamera = Camera.main;
        _videoPlayer.prepareCompleted += VideoPlayerOnPrepareCompleted;
        _videoPlayer.Prepare();

    }

    private void VideoPlayerOnPrepareCompleted(VideoPlayer source)
    {
        source.prepareCompleted -= VideoPlayerOnPrepareCompleted;
        // Prepare の Completed 時にPlay を同時に呼ぶことでストリーミング再生を行う
        source.Play();
    }
}

このスクラップは2021/06/21にクローズされました