如何在UnityUI上播放视频

  • Post author:
  • Post category:其他


实现在unity上播放视频有很多种:

第一种新建一个Cube直接将视频文件放到Cube上运行就可以播放了

第二种使用插件Easy

MovieTexture

t或者是AVProVideo

第三种


在移动端播放影片,在你打包时你会发现 Unity 会提示你类似于“没有发现 Movie Texture 类型”这样的错误,这是因为移动平台不支持这个类。所以我们需要用到 Handheld.PlayFullScreenMovie 方法来实现移动平台上视频的播放。移动平台支持 .mov, .mp4, .mpv, and .3gp 四种格式视频。

Handheld.PlayFullScreenMovie 方法专用于移动平台(IOS,Android)播放视频,在视频播放时,Unity会暂停运行,直至视频结束。也就是说当视频结束后,才会开始执行这行代码的下一行代码。

Handheld.PlayFullScreenMovie 方法共有四个重载方法,这里分别介绍一下每个参数:

path:

表示文件的路径。需要加载的影片必须放在 Assets/ StreamingAssets/ 路径下,此路径作为影片文件的根目录,若无子目录,则直接通过“Movie.mp4”文件名来表示 Movie 文件的路径。

bgColor:

表示背景颜色。通常指定为 Color.black。

controlMode:

表示视频的控制模式,此为 FullScreenMovieControlMode 类型的结构体,共四个成员:

FullScreenMovieControlMode.Full 表示播放视频时应用完整的视频控制器,如进度条、暂停等;

FullScreenMovieControlMode.Minimal 表示播放视频时应用最简的视频控制器;

FullScreenMovieControlMode.CancelOnInput 表示播放视频时点击屏幕即关闭视频;

FullScreenMovieControlMode.Hidden 表示不接受任何控制,直到视频播放完成。

scalingMode:

表示视频的缩放模式,此为 FullScreenMovieScalingMode 类型的结构体,共有四个成员:

FullScreenMovieScalingMode.None 不缩放该视频;

FullScreenMovieScalingMode.AspectFit 缩放视频直到尺寸适合屏幕;

FullScreenMovieScalingMode.AspectFill 缩放视频直到视频填充整个屏幕;

FullScreenMovieScalingMode.Fill 缩放视频直到长宽完全适合屏幕。

第四种 先上代码

//图像

public RawImage image;

//播放器

public VideoPlayer vPlayer;

//播放

public Button btn_Play;

//暂停

public Button btn_Pause;

//视频控制器

public Slider sliderVideo;

//当前视频时间

public Text text_Time;

//当前视频时间传递

public int textTime=0;

//视频总时长

public Text text_Count;

//视频总时长传递

public int textCount=0;

//音频组件

//public AudioSource source;

//需要添加播放器的物体

public GameObject obj;

//是否拿到视频总时长

public bool isShow=false;

//前进后退的大小

public float numBer = 20f;

//时 分的转换

private int hour, mint;

private float time;

private float time_Count;

private float time_Current;

//视频是否播放完成

public  bool isVideo;

private bool isBoFangfang = true;

// Use this for initialization

void Start () {


image = obj.GetComponent<RawImage>();

vPlayer = obj.AddComponent<VideoPlayer>();

//这3个参数不设置也会没声音 唤醒时就播放关闭

vPlayer.playOnAwake = false;

//  source.playOnAwake = false;

//  source.Pause();

isShow = true;

//初始化 string url = Application.streamingAssetsPath + “/EasyMovieTexture.mp4”;

//Init(Application.streamingAssetsPath + “/GuangChangWu.mp4”);

Init(Application.streamingAssetsPath + “/1.mp4”);

btn_Play.onClick.AddListener(delegate { OnClick(0); });

btn_Pause.onClick.AddListener(delegate { OnClick(1); });

//  sliderVideo.onValueChanged.AddListener(delegate { ChangeVideo(sliderVideo.value); });

}

/// <summary>

///     初始化VideoPlayer

/// </summary>

/// <param name=”url”></param>

private void Init(string url) {


isVideo = true;

isShow = true;

time_Count = 0;

time_Current = 0;

sliderVideo.value = 0;

//设置为URL模式

vPlayer.source = VideoSource.Url;

//设置播放路径

vPlayer.url = url;

//在视频中嵌入的音频类型

vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;

//把声音组件赋值给VideoPlayer

//  vPlayer.SetTargetAudioSource(0, source);

//当VideoPlayer全部设置好的时候调用

//  vPlayer.prepareCompleted += Prepared;

//启动播放器

vPlayer.Prepare();

}

private void OnClick(int num) {


switch (num)

{

case 0:

isShow = true;

isBoFangfang = true;

vPlayer.Play();

isVideo = true;

break;

case 1:

isBoFangfang = false;

isShow = false;

vPlayer.Pause();

break;

default:

break;

}

}

void Update ()

{


if (!isBoFangfang)

{


vPlayer.Pause();

}

if (vPlayer.isPlaying && isShow)

{


//把图像赋给RawImage

image.texture = vPlayer.texture;

//帧数/帧速率=总时长    如果是本地直接赋值的视频,我们可以通过VideoClip.length获取总时长

sliderVideo.maxValue = vPlayer.frameCount/vPlayer.frameRate;

time = sliderVideo.maxValue;

hour = (int)time / 60;

mint = (int)time % 60;

textCount = hour * 60 + mint;

text_Count.text = string.Format(“/  {0:D2}:{1:D2}”, hour.ToString(), mint.ToString());

}

if (Mathf.Abs((int)vPlayer.time – (int)sliderVideo.maxValue) == 0)

{


vPlayer.frame = (long)vPlayer.frameCount;

vPlayer.Stop();

Debug.Log(“播放完成!”);

isVideo = false;

sliderVideo.value = 0;

hour = 0;

mint = 0;

text_Time.text = string.Format(“{0:D2}:{1:D2}”, hour.ToString(), mint.ToString());

return;

}

else if (isVideo && vPlayer.isPlaying)

{


time_Count += Time.deltaTime;

if ((time_Count – time_Current) >=1)

{


sliderVideo.value += 1f;

time_Current = time_Count;

time = (float)vPlayer.time;

hour = (int)time / 60;

mint = (int)time % 60;

textTime = hour * 60 + mint;

text_Time.text = string.Format(“{0:D2}:{1:D2}”, hour.ToString(), mint.ToString());

}

}

}

原理就是使用unity中的VideoPlayer组件赋值和控制等等

新建canves新建RawImage物体,给物体挂上脚本就可以了



版权声明:本文为m0_37925407原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。