アセットバンドル化した動画の再生方法
そこで筆者は動画をローカルからのストリーミング再生にすることでこの問題を解決をしました。
具体的には下記の手順で実装をしています。
- 動画を手動でMP4(h264, AAC)に変換
- 動画をバイナリデータとしてアセットバンドル化
- アセットバンドルから動画を読み込む
- 読み込んだ動画を任意のディレクトリに保存
- VideoPlayerのurlに保存したパスを指定する
- 再生
これで動画の再生を行いました。
手順は長く見えますが実際にはコードも短く大した処理ではないので簡単に実装ができます。
動画を手動でMP4(h264, AAC)に変換
動画はフリーソフトで変換してテストしました。
実際には動画作成者にフォーマットを変換しておくようにお願いすれば問題ないかと思います。
動画をバイナリデータとしてアセットバンドル化
1で変換した動画の拡張子を bytes とすることでバイナリデータとして認識させます。
アセットバンドルから動画の読み込む
単純にアセットバンドルのロード処理です。
読み込んだ動画を任意のディレクトリに保存
バイナリとして読み込んだ動画を下記のディレクトリ内の任意の場所に保存します。
Application.persistentDataPath
persistentDataPathは実行中に保存されるファイルを格納する場所なので動画もそこに保存しています。
VideoPlayerのurlに保存したパスを指定する
ローカルの保存したパスをURLに指定します。
パスの先頭には file:/// を追記する必要があります。
再生
普通に再生します。
この手順で再生が完了です。
アセットバンドル化する部分は各々に対応していただく必要がありますが、実際のコードは下記になります。
AssetBundleMovie.cs
using System.Collections;
using UnityEngine;
using UnityEngine.Video;
using UnityEngine.Networking;
using System.IO;
public class AssetBundleMovie : MonoBehaviour
{
[SerializeField]
private VideoPlayer videoPlayer;
IEnumerator LoadAndPlayMovie()
{
string path = $"{Application.persistentDataPath}/movie.m4v";
if (!File.Exists(path))
{
// アセットバンドルのダウンロード(今回はStreamingAssetsを使用)
string uri = $"file:///{Application.dataPath}/AssetBundles/movie.movie";
UnityWebRequest request = UnityWebRequest.Get(uri);
yield return request.SendWebRequest();
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
// アセットバンドルからバイナリ化した動画のロード
var movie = bundle.LoadAsset("movie.bytes");
// 動画をローカルに保存
var file = File.OpenWrite(path);
file.Write(movie.bytes, 0, movie.bytes.Length);
file.Close();
}
// 動画のパスを指定して再生
videoPlayer.url = $"file:///{path}";
videoPlayer.Play();
}
}
今回はテストコードなのでStreamingAssetsからパス直指定で読み込んでいますが、こちらはCDNからダウンロードでも正常に動作します。
動画はローカルに保存済みの場合はローカルのデータをすぐに再生すれば不要なコピーが走ることがないのでいいかと思います。
もし同じようにアセットバンドル化した動画を再生する必要のある方は参考にしてみてください。
そしてもっといい方法を知っている方がいれば教えてもらえると嬉しいです!