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

firebase経由でやったらなぜかurlがローカルファイルに変換されるバグがあった。
そもそもVideoPlayerでサーバー経由のものを再生できるか実験するために、以下を試してみる。

こちらの方がよかった
無事成功!
ってことでサーバー経由は行けた(プロトタイプは最悪これでもいいと思う)。
んじゃなぜ、firebaseは無理だったのか?
urlの設定をインスペクターじゃなくてコードからやってみる

以下のコードから試したけど、問題なく再生される。。。
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にクローズされました