Unity播放服务器端视频 发布到Android移动端

Posted Unity李大馋师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity播放服务器端视频 发布到Android移动端相关的知识,希望对你有一定的参考价值。

文章目录

一、AVProVideo播视频插件

Unity版本 :Unity2020.3.21f1
AVProVido版本:AVPro Video 1.10.1.unitypackage
(AVProVido链接:https://pan.baidu.com/s/1gEbU1KMaRM8p9AjGHZJdLw?pwd=2022 提取码:2022)

二、制作过程

重点总结

第一阶段,建“播放UI”、“媒体播放器”。
第二阶段,把媒体播放器拖给播放UI。
第三阶段,设置媒体播放器,所播放服务器视频的URL。

具体步骤

准备:
导入AVProVideo1.10.1后,会有Bug

原因是与Unity版本不太适配——Bug显示与VR相关,点击控制台的报错,在VS中把相关代码注释掉或删掉,即可解决。
(注意,在注释代码的时候,它前后会有#开头的编辑器语句,要么保留完整的# #end组合,要么把这个组合完整的注释掉:因如果只注释掉开头的#语句,留着结束#end,#end处就会报错)
#开头的编辑器语句例子,如图

我这里注释掉后的代码,如下,以做参考

#if UNITY_5_4_OR_NEWER || (UNITY_5 && !UNITY_5_0 && !UNITY_5_1 && !UNITY_5_2 && !UNITY_5_3_0 && !UNITY_5_3_1 && !UNITY_5_3_2)
	#define UNITY_HAS_VRCLASS
#endif

using UnityEngine;

//-----------------------------------------------------------------------------
// Copyright 2015-2018 RenderHeads Ltd.  All rights reserverd.
//-----------------------------------------------------------------------------

namespace RenderHeads.Media.AVProVideo.Demos

	/// <summary>
	/// A demo for playing back 360 video on a mesh, handles rotation of the main camera
	/// Supports rotation by VR device, gyroscope or mouse
	/// </summary>
	public class SphereDemo : MonoBehaviour
	
		[SerializeField]
		private bool _zeroCameraPosition = true;

		#pragma warning disable 0414    // suppress value not used warning
		[SerializeField]
		private bool _allowRecenter = false;

		[SerializeField]
		private bool _allowVrToggle = false;

		[SerializeField]
		private bool _lockPitch = false;

		#pragma warning restore 0414    // restore value not used warning

		private float _spinX;
		private float _spinY;

		private void Start()
		
#if UNITY_HAS_VRCLASS
			//if (UnityEngine.VR.VRDevice.isPresent)
			//
			//	return;
			//
#endif
			if (SystemInfo.supportsGyroscope)
			
				Input.gyro.enabled = true;
				this.transform.parent.Rotate(new Vector3(90f, 0f, 0f));
			
		

		private void OnDestroy()
		
			if (SystemInfo.supportsGyroscope)
			
				Input.gyro.enabled = false;
			
		

		void Update()
		
#if UNITY_HAS_VRCLASS
			//if (UnityEngine.VR.VRDevice.isPresent)
			//
			//	// Mouse click translates to gear VR touch to reset view
			//	if (_allowRecenter && (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)))
			//	
			//		UnityEngine.VR.InputTracking.Recenter();
			//	
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
				//if (_allowVrToggle && Input.GetKeyDown(KeyCode.V))
				//
				//	UnityEngine.VR.VRSettings.enabled = !UnityEngine.VR.VRSettings.enabled;
				//
#endif
			//
			//else
#endif
			//
			//	if (SystemInfo.supportsGyroscope)
			//	
			//		// Invert the z and w of the gyro attitude
			//		this.transform.localRotation = new Quaternion(Input.gyro.attitude.x, Input.gyro.attitude.y, -Input.gyro.attitude.z, -Input.gyro.attitude.w);
			//	
			//	// Also rotate from mouse / touch input
			//	else 
			//	
			//		if (Input.GetMouseButton(0))
			//		
			//			float h = 40.0f * -Input.GetAxis("Mouse X") * Time.deltaTime;
			//			float v = 0f;
			//			if (!_lockPitch)
			//			
			//				v = 40.0f * Input.GetAxis("Mouse Y") * Time.deltaTime;
			//									
			//			h = Mathf.Clamp(h, -0.5f, 0.5f);
			//			v = Mathf.Clamp(v, -0.5f, 0.5f);
			//			_spinX += h;
			//			_spinY += v;
			//		
			//		if (!Mathf.Approximately(_spinX, 0f) || !Mathf.Approximately(_spinY, 0f))
			//		
			//			this.transform.Rotate(Vector3.up, _spinX);
			//			this.transform.Rotate(Vector3.right, _spinY);

			//			_spinX = Mathf.MoveTowards(_spinX, 0f, 5f * Time.deltaTime);
			//			_spinY = Mathf.MoveTowards(_spinY, 0f, 5f * Time.deltaTime);
			//		
			//	
			//
		

		void LateUpdate()
		
			if (_zeroCameraPosition)
			
				Camera.main.transform.position = Vector3.zero;
			
		
	

(1)因AVProVideo也是在UGUI的Canvas下播放,得先建立Canvas,然后在Canvas组件上,右键——>UI——>AVPro Video uGUI

(2)在Hierarchy层级视图空白处,右键——>AVPro Video——>Media Player,即建立媒体播放器

(3)把Media Player,拖给第1步建立的AVPro Video uGUI

(4)给上步建立的MediaPlayer,设置播放网址,依次设置如下

三、发布

发布到android端如下(如果发布到ios苹果端,注意MediaPlayer的Inspector视图,也是根据其中的报错对Player Settings进行设置)
1、注意下面两个图中的设置
图一、去除Vulkan

图二、改网络接入

2、关于部分机型,视频播放不了的问题
Unity使用AVProVideo安卓端无法播放http视频解决办法
注意:
(1)如果己方工程没有AndroidManifest.xml文件,需勾选Edit->Project Settings->Publishing Setting->Custom Main Manufest ,U3D 自动生成一个。
(2)里面第二个Xml文件,需自己创建——创建方法是:先建一个寻常的C#脚本,然后右键Show In Explorer,改文件后缀名为xml。

Unity实现Android端视频播放

本文只讲Android短的视频播放

实现方式

使用Handheld.PlayFullScreenMovie(),这个函数实现。具体如下:

1.创建StreamingAssets文件夹,此文件夹放入视频资源(.mp4),如图:

技术图片

2.创建测试UI(在这里我创建了些Button,分别点击播放鸽各自视频),如图:

技术图片

3.具体代码:

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.UI;
 5 using DG.Tweening;
 6 using System;
 7 /// <summary>
 8 /// Android端播放视频
 9 /// </summary>
10 public class PlayVideo : MonoBehaviour {
11     public Button FlexBtn;//菜单栏伸缩按钮(控制菜单栏的伸缩)
12     public Button[] BtnList;//所管理的各个视频的播放按钮
13     public Transform VBtnMgr;//按钮的父物体
14     void Start () {
15         VBtnMgr.transform.localScale = new Vector3(0,0,1);//初始化菜单栏状态(隐藏状态)
16         //给按钮动态添加点击事件
17         for (int i = 0; i < BtnList.Length; i++)
18         {
19             switch (i)
20             {
21                 case 0:
22                     BtnList[i].onClick.AddListener(()=> { OnClickBtn(0); });
23                     break;
24                 case 1:
25                     BtnList[i].onClick.AddListener(() => { OnClickBtn(1); });
26                     break;
27                 case 2:
28                     BtnList[i].onClick.AddListener(() => { OnClickBtn(2); });
29                     break;
30                 case 3:
31                     BtnList[i].onClick.AddListener(() => { OnClickBtn(3); });
32                     break;
33                 case 4:
34                     BtnList[i].onClick.AddListener(() => { OnClickBtn(4); });
35                     break;
36                 default:
37                     break;
38             }
39         }
40     }
41     //控制菜单栏按钮点击事件
42     bool isOpen = true;//伸缩开关
43     public void OnClickFlexBtn()
44     {
45         SetMenuState(isOpen);
46         isOpen = !isOpen;
47     }
48     //菜单栏伸缩控制
49     public void SetMenuState(bool isC)
50     {
51         int target = 0;
52         if (isC)
53         {
54             target = 1;
55         }
56         VBtnMgr.transform.DOScale(target, 0.5f);
57     }
58     //各个视频按钮的触发事件
59     public void OnClickBtn(int index)
60     {
61         switch (index)
62         {
63             case 0:
64                 Debug.Log("Cat");
65                 Handheld.PlayFullScreenMovie("CAT.mp4", Color.black, FullScreenMovieControlMode.Full);//播放名为CAT的视频
66                 break;
67             case 1:
68                 Debug.Log("WW");
69                 Handheld.PlayFullScreenMovie("WW.mp4", Color.black, FullScreenMovieControlMode.Full);
70                 break;
71             case 2:
72                 Debug.Log("WD");
73                 Handheld.PlayFullScreenMovie("WD.mp4", Color.black, FullScreenMovieControlMode.Full);
74                 break;
75             case 3:
76                 Debug.Log("WTWO");
77                 Handheld.PlayFullScreenMovie("WWW.mp4", Color.black, FullScreenMovieControlMode.Full);
78                 break;
79             case 4:
80                 Debug.Log("TEXT");
81                 Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Full);
82                 break;
83             default:
84                 break;
85         }
86     }
87     //退出按钮
88     public void OnclickExitBtn()
89     {
90         Application.Quit();
91     }
92 }

完成以上,打包发布即可实现。

注意:在这里我只向大家展示播放视频功能,至于文件夹StreamingAssets打包后产生的占用内存问题我并没有处理,此文件夹会将其中所有资源全部打包,所以在开发中不建议将文件放在此文件夹

最后欢迎并渴望指正交流

 

以上是关于Unity播放服务器端视频 发布到Android移动端的主要内容,如果未能解决你的问题,请参考以下文章

UMP(2.0.2) Unity Android端开发

移动端播放视频文件

unity视频播放,

Android主流视频播放及缓存实现原理调研

AVProVideo☀️六Unity播放PC端和安卓端视频以及对视频的读写方法

Unity 渲染 Android播放的视频画面