常用的方法
Unity在移动端进行操作播放视频时,常用的方法有如下集中:
- Unity自带的播放:
但这个存在一定的问题,如:Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
1.视频播放时触摸屏幕视频关闭
2.视频播放时弹出IOS高级控件,控制视频暂停播放 全屏等等。
3.视频播放时无法停止,当其播放完一次后自动关闭
4.视频播放时弹出IOS高级控件,可控制播放进度。
-
使用插件如: 1.Mobile Movie Texture V1.17a.untiypackage
下载地址:链接:http://pan.baidu.com/s/1kUUZOnt 密码:weni
2.Easy Movie Texture 2.36.unitypackage
下载地址:链接:http://pan.baidu.com/s/1mihiZbU 密码:hdp7 -
插件播放的弊端: 兼容性特别不好,特别是iOS移动端
特殊方法
利用Vufoia视频组件制作移动端播放视频方法,优势兼容性好,操作方便,不仅能运用于Vufoia增强显示视频播放中,而且还能单独运用于普通移动端视频播放,具体操作如下:
流程
下载Vufoia视频播放相关组件:
下载地址:https://developer.vuforia.com/downloads/samples
这里我使用的是4.2.3版本(功能基本一致,只是略有区分,不是重点):
导入Unity中可以得到视频播放的相关预制体:
处理代码:
自定义一个加载视频的脚本:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Vuforia;
using System.IO;
/// <summary>
/// 动态添加AR相关物体或视频
/// </summary>
public class LoadARObject:MonoBehaviour
{
/// <param name="ObjPath">资源所在路径</param>
/// <param name="TrackerName">资源实例化之后的位于Vufoia某一个Tracker的位置</param>
/// <param name="Type">资源类型</param>
/// <param name="ObjName">资源实例化之后的名字</param>
/// <returns></returns>
public static GameObject LoadObject(string ObjPath,string TrackerName,string Type,string ObjName)
{
switch (Type)
{
case "Movie":
return LoadMovie(ObjPath, TrackerName, ObjName);
default:
return null;
break;
}
}
/// <param name="MoviePath">资源所在路径</param>
/// <param name="TrackerName">资源实例化之后的位于Vufoia某一个Tracker的位置</param>
/// <param name="MovieName">资源实例化之后的名字</param>
/// <returns></returns>
static GameObject LoadMovie(string MoviePath, string TrackerName,string MovieName)
{
var VideoPrefab = (GameObject)Instantiate(Resources.Load("XQResources/Video"));
VideoPrefab.transform.SetParent(GameObject.Find(TrackerName).transform,false);
VideoPrefab.name = MovieName;
VideoPrefab.GetComponentInChildren<VideoPlaybackBehaviour>().m_path = MoviePath;
VideoPrefab.GetComponentInChildren<VideoPlaybackBehaviour>().enabled = true;
return VideoPrefab;
}
}
自定义一个播放、暂停、停止控制代码:
using UnityEngine;
using System.Collections;
/// <summary>
/// 视频播放
/// </summary>
public class VideoTool : MonoBehaviour {
// Pause all videos except this one
static void PauseOtherVideos(VideoPlaybackBehaviour currentVideo)
{
VideoPlaybackBehaviour[] videos = (VideoPlaybackBehaviour[])
FindObjectsOfType(typeof(VideoPlaybackBehaviour));
foreach (VideoPlaybackBehaviour video in videos)
{
if (video != currentVideo)
{
if (video.CurrentState == VideoPlayerHelper.MediaState.PLAYING)
{
video.VideoPlayer.Pause();
}
}
}
}
public static void VideoPlay(string TrackerName)
{
var obj = GameObject.Find(TrackerName);
if (!obj) {
return;
}
VideoPlaybackBehaviour video = obj.GetComponentInChildren<VideoPlaybackBehaviour>();
if (video != null)
{
if (video.VideoPlayer.IsPlayableOnTexture())
{
VideoPlayerHelper.MediaState state = video.VideoPlayer.GetStatus();
if ((state == VideoPlayerHelper.MediaState.PAUSED) ||
state == VideoPlayerHelper.MediaState.READY ||
state == VideoPlayerHelper.MediaState.STOPPED)
{
// Pause other videos before playing this oneS
PauseOtherVideos(video);
// Play this video on texture where it left off
video.VideoPlayer.Play(false, video.VideoPlayer.GetCurrentPosition());
}
else if (state == VideoPlayerHelper.MediaState.REACHED_END || (state == VideoPlayerHelper.MediaState.PAUSED))
{
// Pause other videos before playing this one
PauseOtherVideos(video);
// Play this video from the beginning
video.VideoPlayer.Play(false, 0);//IS FULL
}
}
}
}
public static void VideoPause(string TrackerName)
{
Debug.Log(TrackerName);
var obj = GameObject.Find(TrackerName);
if (!obj) {
return;
}
VideoPlaybackBehaviour video = obj.GetComponentInChildren<VideoPlaybackBehaviour>();
if (video)
video.VideoPlayer.Pause();
}
public static void VideoStop(string TrackerName)
{
var obj = GameObject.Find(TrackerName);
if (!obj) {
return;
}
VideoPlaybackBehaviour video = obj.GetComponentInChildren<VideoPlaybackBehaviour>();
video.VideoPlayer.SeekTo(0);
video.VideoPlayer.Pause();
}
}
注意事项:
(1)测试需要在移动端进行,非移动端无法直接使用
(2)必须导入Vufoia视频播放相关组件及完整代码