Unity中使用AVproVideo播放全景视频(HTCVIVI)

时间:2024-04-13 13:48:01

Unity中使用HTCVIVE播放全景视频(AVProVideo插件)

1、前言

刚入职第一周做了一项目小demo,接下来给大家分享一下我的感悟吧!
1.1、Unity中播放全景视频有很多种方法,但都是大同小异,播放视频都需要有一个载体,我们看电视时,是屏幕,看电影时,是影院的画布,SO,Unity中播放视频可以是UI 也可以是Cube等,全景视频的每一帧就是一张全景图片,所以我们用一个球来当做载体。
1.2、你可以使用MoveTexture,或者PlayerVideo来做,原理都是一样的,获取球的材质球,把视频作为纹理贴上去,然后把摄像机放到球的中心,然后有API控制播放。但是要注意球的内部是看不到的所以要自己写一个Shader来让球的内部可以看到

Shader代码如下:

Shader "Unlit/UnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        Cull Front //剔除正面,用于看到球体的内
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fog
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {

                float u_x=1-i.uv.x;    //因为球的内部是像镜子一样反着的
                float u_y=i.uv.y;      //所以要改变其uv坐标
                i.uv=float2(u_x,u_y);  //只改变x,就行了,


                fixed4 col = tex2D(_MainTex, i.uv);
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

这种方法网上都有,我就不详细介绍了。
1.3、我一开始使用以上两种方法,但是后来都因为各种原因报错,很无奈,于是就是找到了这个AV插件。哈哈哈,插件AVProVideo可以从Github上下载,地址如下:AVProVideo下载地址,这里面有很多例子,多参考一下。

2、功能制作

2.1首先新建工程将下载的工程导入到工程中,我们可以看到它自带有很多的案例,案例中的视频都是读取的StreamingAssets下的,如果我们想要读取网络上的视频时,我们需要打开Media Player组件将连接复制到上面就行:

Unity中使用AVproVideo播放全景视频(HTCVIVI)
在案例8中就是一个全景视频的小Demo可以参考,将视频导入到StreamAssets文件夹下,将球的预制体拖入到场景中,这是插件封装好的,只需要将视频拖上就可以了。
2.2将Htc的位置放到球的中间,运行就行了,此外你也可以加入按钮,或者进度条等下面会具体介绍进度条。
Unity中使用AVproVideo播放全景视频(HTCVIVI)

2.3主要还是研究一下Media Player组件的每项功能,我还没研究完就不说了,说一下进度条吧,新建Slider ,Text等
话不多说,直接上代码。

public class VCR : MonoBehaviour 
	{
		public MediaPlayer	_mediaPlayer;
	
		public Slider		_videoSeekSlider;
		private float		_setVideoSeekSliderValue;
		private bool		_wasPlayingOnScrub;
		public void OnVideoSeekSlider()
		{
			if (PlayingPlayer && _videoSeekSlider && _videoSeekSlider.value != _setVideoSeekSliderValue)
			{
				PlayingPlayer.Control.Seek(_videoSeekSlider.value * PlayingPlayer.Info.GetDurationMs());
			}
		}
		public void OnVideoSliderDown()
		{
			if(PlayingPlayer)
			{
				_wasPlayingOnScrub = PlayingPlayer.Control.IsPlaying();
				if( _wasPlayingOnScrub )
				{
					PlayingPlayer.Control.Pause();
//					SetButtonEnabled( "PauseButton", false );
//					SetButtonEnabled( "PlayButton", true );
				}
				OnVideoSeekSlider();
			}
		}
		public void OnVideoSliderUp()
		{
			if(PlayingPlayer && _wasPlayingOnScrub )
			{
				PlayingPlayer.Control.Play();
				_wasPlayingOnScrub = false;

//				SetButtonEnabled( "PlayButton", false );
//				SetButtonEnabled( "PauseButton", true );
			}			
		}
}

j脚本挂的如下:Unity中使用AVproVideo播放全景视频(HTCVIVI)

3、结语

播放视频很简单,主要还是看使用HTC交互的功能,在以后的文章中,我将逐渐描述HTCVIVI的各种用法,由于刚开始写博客,可能描述不是很清楚,大家可以加QQ群一块商讨:QQ群319506028;拒绝闲聊,学技术请进。