Unity播放视频方法汇总

常用的方法

Unity在移动端进行操作播放视频时,常用的方法有如下集中:

  1. Unity自带的播放:
    Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
    但这个存在一定的问题,如:

    1.视频播放时触摸屏幕视频关闭
    2.视频播放时弹出IOS高级控件,控制视频暂停播放 全屏等等。
    3.视频播放时无法停止,当其播放完一次后自动关闭
    4.视频播放时弹出IOS高级控件,可控制播放进度。

  2. 使用插件如:                                                                                         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  
                       

  3. 插件播放的弊端:                                                                                           兼容性特别不好,特别是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视频播放相关组件及完整代码


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值