1. 程式人生 > >移動端播放視頻文件

移動端播放視頻文件

cnblogs [0 ttext get logs href hand unity 移動

移動端

在移動端,unity並不提供MovieTexture,AVPro QuickTime也用不了,其最基本的顯示方案使用通過PlayFullScreenMovie()函數進行全屏播放,根據其官網解釋,主要有以下方面:

(1)視頻流直接從設備存儲器中獲得,所以文件只能是單獨提供,視頻文件放置在StreamingAssets 文件夾中
(2) 視頻播放過陳中,Unity將會停止;播放結束後unity自動恢復;播放過程中屏幕中的顏色會變為播放器的背景顏色,播放之後恢復。
(3)在IOS中,內部實際上是調用MPMoviePlayerController的方法
(4)能夠支持的格式: .mov, .mp4, .mpv, and .3gp ,H.264,MPEG-4 Part 2 video

 Handheld.PlayFullScreenMovie ("StarWars.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);

話不投機,兩句多,還是果斷第三方插件,Mobile movie texture for android 就是很不錯的東西,利用開源視頻編解碼庫Theora進行視頻解碼,然後通過Unity Texture實現顯示。下圖為多視頻顯示效果:

技術分享



應用中的一些問題:
(1)因為視頻編解碼庫是使用Theora ,所以只能支持OGG、OGV格式的視頻和音頻,如果要使用其他格式則需要轉換一下,可以Theora Converter .NET工具進行轉換。
(2)視頻seek功能不是很精確,雖然能用
(3)多視頻播放問題,如果想要多少視頻同時播放,需要理解內部代碼的實現,修改後可以湊合著使用。多視頻播放的另外一個問題是效率問題,如果是N個視頻,可能就會有N個後臺線程在進行解碼操作,相應的也會有N個渲染管道進行渲染,我在RK3188上進行三個不同視頻的播放,就會有卡頓。多視頻播放中間理解的關鍵代碼在下面,Texture2D.CreateExternalTexture 函數從視頻中獲得貼圖資源,SetTextures()進行繪制,如果使用多個視頻,需要多個材質(也就是多個渲染管道)。
技術分享
        private void AllocateTexures()
        {
            m_ChannelTextures[0] = Texture2D.CreateExternalTexture(m_yStride, m_yHeight, TextureFormat.BGRA32, false, false, GetNativeYHandle(m_nativeContext));
            m_ChannelTextures[1] = Texture2D.CreateExternalTexture(m_uvStride, m_uvHeight, TextureFormat.RGBA32, false, false, GetNativeCrHandle(m_nativeContext));
            m_ChannelTextures[2] = Texture2D.CreateExternalTexture(m_uvStride, m_uvHeight, TextureFormat.RGBA32, false, false, GetNativeCbHandle(m_nativeContext));

            if (m_movieMaterials != null)
            {
                for (int i = 0; i < m_movieMaterials.Length; ++i)
                {
                    var mat = m_movieMaterials[i];

                    if (mat != null)
                    {
                        SetTextures(mat);
                    }
                }
            }
            
        }

        public void SetTextures(Material material)
        {
            material.SetTexture("_YTex", m_ChannelTextures[0]);
            material.SetTexture("_CrTex", m_ChannelTextures[1]);
            material.SetTexture("_CbTex", m_ChannelTextures[2]);

            material.SetTextureScale("_YTex", m_uvYScale);
            material.SetTextureOffset("_YTex", m_uvYOffset);

            material.SetTextureScale("_CbTex", m_uvCrCbScale);
            material.SetTextureOffset("_CbTex", m_uvCrCbOffset);
        }
技術分享




http://www.cnblogs.com/zsb517/p/4060814.html

移動端播放視頻文件