標籤:lan 根據 結合 初始化 線程 drawtext height 相機 tsp
Unity視頻播放有很多種實現方式,可根據要求來選擇適當的實現,這裡總結一下:
1. MovieTexture
Unity標準介面,支援的播放視頻格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。僅支援PC端的本地視頻播放。
1. 在遊戲對象中播放,就好比在遊戲世界中建立一個Plane面對象,攝像機直直的照射在這個面上
在建立的一個plane平面,將其紋理綁定為電影紋理即可
//設定當前對象的主紋理為電影紋理
renderer.material.mainTexture = movTexture;
//設定電影紋理播放模式為迴圈
movTexture.loop = true;
並可通過
movTexture.Play();
movTexture.Pause();
movTexture.Stop();
來進行播放控制。
此時可以通過直接縮放plane平面來達到縮放視頻的目的
至於MovieTexture的賦值,在5.0x版本上是無法通過將視頻拖入Project視頻來自動造成紋理的。
2. 在GUI層面播放。它其實和貼圖非常相像,因為播放視頻用到的MovieTexture屬於貼圖Texture的子類。
//繪製電影紋理
GUI.DrawTexture(newRect(0,0, Screen.width,Screen.height),movTexture,ScaleMode.StretchToFill);
播放視頻的大小是螢幕的寬高,如果想動態修改視頻的寬或高直接修改new Rect()視頻顯示地區即可
2. Handheld.PlayFullScreenMovie
Unity標準的視頻播放介面,支援的播放視頻格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。支援PC/移動端播放,支援本地線上播放
url_movie = "http://dl.nbrom.cn/17051/c3e408229342723fbdf62d0bcf1d549c.mp4?fsname=Criminal_Minds_S01E01.mp4";
Handheld.PlayFullScreenMovie(url_movie, Color.black, FullScreenMovieControlMode.Full);
Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
將視頻檔案放置在Assets/StreamingAssets/路徑下
上面的方法在移動端是邊下載邊播放網路視頻的,屬於線上播放,不好的地方就是,再次觀看還需要再次載入。可能在播放的時候判斷是否已下載到本地如果在本地就可以播放本地,如果沒有再從網上下載到本地
3. EasyMovieTexture
Unity移動端第三方視頻播放外掛程式,可使用視訊本地播放,支援RTSP。
1>. 初始化載入,該部分主要在Unity中將播放視頻的地址(本地/URL)傳送到Android,並完成MediaPlayer的初始化
2>. Android建立一個Surface,並將其與之前建立的MediaPlayer綁定
3>. 結合視頻繪製載體計算映像展開比
4>. 根據視頻寬高比建立VideoTexture並傳到Android與
m_VideoTexture = new Texture2D(Call_GetVideoWidth(), Call_GetVideoHeight(), TextureFormat.RGB565, false);
Call_SetUnityTexture(m_VideoTexture.GetNativeTextureID());
5>. 設定視頻視窗,完成TextureId與surface的綁定
SetWindowSize(GetVideoWidth(),GetVideoHeight(),m_iUnityTextureID ,m_bRockchip);
6>. 更新紋理
Call_UpdateVideoTexture();
m_SurfaceTexture.updateTexImage();
7>. 播放視頻
使用MediaPlayer播放視頻
4. MediaPlayer + SurfaceTexture
播放組件上層使用MediaPlayer來處理,在成功建立並設定好setDataSource後,需要建立GL_TEXTURE_EXTERNAL_OES格式的紋理ID來與MediaPlayer產生聯絡。
在這裡我們需要使用SurfaceTexture的理由是,它能代替SurfaceHolder,使得當我們指定映像流的輸出目標為照相機預覽或視頻解碼時,我們在每一幀中得到的所有資料不需要直接用於顯示在裝置上,而是可以選擇先輸出到SurfaceTexture上,在上屏之前可能做一些自訂擴充。當調用updateTexImage()時,用來建立SurfaceTexture的紋理對象內容被更新為包含映像流中最近的圖片。
SurfaceTexture對象可以在任何線程裡建立。但updateTexImage()只能在包含紋理對象的OpenGL ES上下文所在的線程裡建立。可以得到幀資訊的回調可以在任何線程被調用。這一點要注意,上下文如果不一致,視頻無法上屏。
這裡還有個要求就是在建立紋理的時候,需要使用使用GL_TEXTURE_EXTERNAL_OES作為紋理目標,其是OpenGL ES擴充GL_OES_EGL_image_external定義的。這種紋理目標會對紋理的使用方式造成一些限制。每次紋理綁定的時候,都要綁定到GL_TEXTURE_EXTERNAL_OES,而不是GL_TEXTURE_2D。而且,任何需要從紋理中採樣的OpenGL ES 2.0 shader都需要聲明其對此擴充的使用,例如,使用指令”#extension GL_OES_EGL_image_external:require”。這些shader也必須使用samplerExternalOES採樣方式來訪問紋理。
unity 中播放視頻