一、加载单个视频
最基础代码,使用UnityWebRequest加载StreamingAssets文件下的单个视频文件
private VideoPlayer videoPlayer; //播放视频组件
private string videoFolder; //视频文件地址
void Start()
{
//获取VideoPlayer组件
videoPlayer = GetComponent<VideoPlayer>();
//如果测试视频.mp4是在StreamingAssets文件下的extern_resource文件下
videoFolder = Path.Combine(Application.streamingAssetsPath, "extern_resource/测试视频.mp4");
//如果测试视频.mp4是在StreamingAssets文件下的
//videoFolder = Path.Combine(Application.streamingAssetsPath, "测试视频.mp4");
}
//启动方法
void PlayVideo()
{
StartCoroutine(LoadVideo(videoFolder));
}
IEnumerator LoadVideo(string path)
{
using (var unitywebrequest = new UnityWebRequest(path))
{
unitywebrequest.downloadHandler = new DownloadHandlerBuffer();
yield return unitywebrequest.SendWebRequest();
if (unitywebrequest.result != UnityWebRequest.Result.Success)
{
Debug.LogError("视频加载失败:" + unitywebrequest.error);
}
else
{
videoPlayer.url = unitywebrequest.url;
videoPlayer.Pause();
videoPlayer.Play();
}
}
}
基础方法只能提前在代码中写死视频名称进行加载,并且只能加载单个视频,如果要手动替换文件夹里的视频或者加载多个就不适用了。
二、加载多个视频
那么接下来我们在此基础上进行修改,修改为可以动态加载,可以手动替换StreamingAssets文件夹下的视频,或者加载多个视频。如下图所示。根据视频数量和名称生成对应的按钮,点击按钮切换视频。
经测试
1、如果是直接加载打包出index.html文件,可以通过相对路径动态加载StreamingAssets文件下的视频。通过txt可以获取视频名称,后续来拼接地址进行加载。
创建txt命名为VideoList.txt放到StreamingAssets下,把你要加载的视频名称写入到里面。
.
2、如果是把导出的webgl嵌套到前端里,通过前端代码来加载场景,就无法通过相对路径加载出StreamingAssets文件下的视频,可以把视频文件夹放到阿里云上或者腾讯云上加载,所以我们还要动态获取视频文件的路径才可以。
创建一个josn文件放到StreamingAssets文件下,命名为VideoInfo.json
代码如下
private VideoPlayer videoPlayer; //播放视频组件
private string videoFolder; //视频文件地址
private string videoInfoPath; //外部视频文件信息
private string[] videoNames; //视频文件名称(拼接地址使用)
void Start()
{
videoPlayer = UIVideo.transform.GetChild(0).GetComponent<VideoPlayer>();
//上述的第一种实现(直接打开index.html)
videoFolder =Path.Combine(Application.streamingAssetsPath,"extern_resource");
StartCoroutine(LoadVideoList());
//上述的第二种实现(嵌套到前端里,通过前端代码打开)
//StartCoroutine(LoadVideoInfo());
//这里我们已经得到了所有视频的名称,想要什么效果就自己了,如点击按钮切换视频或者上下键切换视频
//也可以加载所有视频了,调用WebLoadVideo()参数就是视频名就可以了
//调用时要去掉首尾空格,否则地址会拼接错误 如:WebLoadVideo(videoNames[0].Trim())
//todo.......
}
}
//打开视频面板
public void OpenVideoPanel()
{
WebLoadVideo(videoNames[0].Trim());//打开面板默认播放第一个视频
}
//加载txt文件
IEnumerator LoadVideoList()
{
jsonPath = Application.streamingAssetsPath + "/VideoList.txt";
UnityWebRequest request = UnityWebRequest.Get(jsonPath);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string jsonContent = request.downloadHandler.text;
videoNames = jsonContent .Split(',');//分割开并存到数组里
}
}
//加载json文件 (可以看我曾经发过的文章)
IEnumerator LoadVideoInfo()
{
jsonPath = Application.streamingAssetsPath + "/VideoInfo.json";
UnityWebRequest request = UnityWebRequest.Get(jsonPath);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string jsonContent = request.downloadHandler.text;
Root root = JsonUtility.FromJson<Root>(jsonContent);
videoFolder = root.URL;
videoNames = root.VideoNames;
}
}
//加载视频
public void WebLoadVideo(string videoName)//参数是视频名称 如 测试.mp4
{
StartCoroutine(LoadVideo(Path.Combine(videoFolder, videoName)));
}
IEnumerator LoadVideo(string path)
{
using (var unitywebrequest = new UnityWebRequest(path))
{
unitywebrequest.downloadHandler = new DownloadHandlerBuffer();
yield return unitywebrequest.SendWebRequest();
if (unitywebrequest.result != UnityWebRequest.Result.Success)
{
Debug.LogError("视频加载失败:" + unitywebrequest.error);
}
else
{
videoPlayer.url = unitywebrequest.url;
videoPlayer.Pause();
videoPlayer.Play();
}
}
}
//关闭视频面板
public void ClosePanel()
{
videoPanel.SetActive(false);
videoPlayer.Pause();
}
//定义json实体类
[System.Serializable]
public class Root
{
public string URL;
public List<string> VideoNames;
}
切记!!!如果手动修改视频路径文件下的视频,记得去修改txt里的视频名称,这两个要同步才可以。上述两种加载方法代码均使用于PC端
主要思路就是上述写的,其他拓展功能大家自行开发。发现问题及时留言,我们一起讨论一起进步。