Пример #1
0
        private void OnDestroy()
        {
#if USE_EASY_MOVIE_TEXTURE || USE_UNITY_VIDEO_PLAYER
            return;
#elif USE_ANDROID_MEDIA_PLAYER
            // This will trigger the shutdown on the render thread
            IssuePluginEvent(MediaSurfaceEventType.Shutdown);
            if (mediaPlayer == null)
            {
                return;
            }
            mediaPlayer.Call("stop");
            mediaPlayer.Call("release");
            mediaPlayer = null;
#elif USE_VIVE_MEDIA_DECODER
            if (mediaDecoder == null)
            {
                return;
            }
            mediaDecoder.stopDecoding();
            mediaDecoder = null;
#else
            if (movieTexture == null)
            {
                return;
            }
            movieTexture.Stop();
            movieTexture = null;
            if (audioSource == null)
            {
                return;
            }
            audioSource.Stop();
            audioSource = null;
#endif
        }
Пример #2
0
        private IEnumerator Initialize()
        {
            movieRenderer = targetSurface.GetComponent <Renderer>();
            if (movieRenderer == null ||
                movieRenderer.material == null ||
                movieRenderer.material.mainTexture == null)
            {
                UpdateState(StateType.Error);
                throw new Exception(TAG + " No surface for media found.");
            }
#if USE_EASY_MOVIE_TEXTURE
            // Prevent Awake called before properties loaded.
            gameObject.SetActive(false);
            // Load EasyMovieTexture properties at runtime.
            easyMovieTexture             = gameObject.AddComponent <MediaPlayerCtrl>() as MediaPlayerCtrl;
            easyMovieTexture.m_bAutoPlay = false;
            easyMovieTexture.m_bLoop     = loop;
            //easyMovieTexture.m_strFileName = videoFile;
            easyMovieTexture.m_TargetMaterial    = new GameObject[1];
            easyMovieTexture.m_TargetMaterial[0] = targetSurface;
            easyMovieTexture.m_bSupportRockchip  = true;
            easyMovieTexture.m_shaderYUV         = Shader.Find("Unlit/Unlit_YUV");
            gameObject.SetActive(true);

            easyMovieTexture.OnReady += OnPrepareComplete;
            easyMovieTexture.OnEnd   += OnVideoPlayComplete;

            easyMovieTexture.Load(videoFile);
            // Following steps will be handled by EasyMovieTexture.
            yield break;
#elif USE_UNITY_VIDEO_PLAYER
            videoPlayer                        = gameObject.AddComponent <UnityEngine.Video.VideoPlayer>();
            videoPlayer.renderMode             = UnityEngine.Video.VideoRenderMode.MaterialOverride;
            videoPlayer.targetMaterialRenderer = targetSurface.GetComponent <MeshRenderer>();

            audioSource = gameObject.AddComponent <AudioSource>();
            videoPlayer.audioOutputMode = UnityEngine.Video.VideoAudioOutputMode.AudioSource;
            videoPlayer.SetTargetAudioSource(0, audioSource);

            videoPlayer.skipOnDrop = true;
            videoPlayer.isLooping  = loop;

            videoPlayer.prepareCompleted += (e) => { OnPrepareComplete(); };
            videoPlayer.loopPointReached += (e) => { OnVideoPlayComplete(); };

            yield return(null);

            string mediaUrl = "file://" + Application.streamingAssetsPath + "/" + videoFile;
#if UNITY_ANDROID && !UNITY_EDITOR
            //mediaUrl = "jar:" + mediaUrl;
            string assetsPath = Application.streamingAssetsPath + "/" + videoFile;
            string dataPath   = Application.persistentDataPath + "/" + videoFile;
            if (!File.Exists(dataPath))
            {
                WWW wwwReader = new WWW(assetsPath);
                yield return(wwwReader);

                if (wwwReader.error != null)
                {
                    Debug.LogError(TAG + " wwwReader error: " + wwwReader.error);
                }

                System.IO.File.WriteAllBytes(dataPath, wwwReader.bytes);
            }
            mediaUrl = dataPath;
#endif
            videoPlayer.url = mediaUrl;
#elif USE_ANDROID_MEDIA_PLAYER
            Media_Surface_Init();
            // TODO: Fix ArgumentException: nativeTex can not be null in Unity 2017.
            nativeTexture = Texture2D.CreateExternalTexture(
                textureWidth,
                textureHeight,
                TextureFormat.RGBA32,
                true,
                false,
                IntPtr.Zero
                );
            IssuePluginEvent(MediaSurfaceEventType.Initialize);

            string assetsPath = Application.streamingAssetsPath + "/" + videoFile;
            string dataPath   = Application.persistentDataPath + "/" + videoFile;
            if (!File.Exists(dataPath))
            {
                WWW wwwReader = new WWW(assetsPath);
                yield return(wwwReader);

                if (wwwReader.error != null)
                {
                    Debug.LogError(TAG + " wwwReader error: " + wwwReader.error);
                }

                System.IO.File.WriteAllBytes(dataPath, wwwReader.bytes);
            }

            // Delay 1 frame to allow MediaSurfaceInit from the render thread.
            yield return(null);

            mediaPlayer = GetMediaPlayerOnTextureID(textureWidth, textureHeight);

            try
            {
                mediaPlayer.Call("setDataSource", dataPath);
                mediaPlayer.Call("setLooping", loop);
            }
            catch (Exception e)
            {
                Debug.LogError(TAG + " Failed to load video for mediaPlayer: " + e.Message);
            }
#elif USE_VIVE_MEDIA_DECODER
            targetSurface.GetComponent <Renderer>().material = convertMaterial;

            mediaDecoder = targetSurface.AddComponent <HTC.UnityPlugin.Multimedia.MediaDecoder>()
                           as HTC.UnityPlugin.Multimedia.MediaDecoder;

            if (stereoSurface != null && stereoSurface2 != null)
            {
                HTC.UnityPlugin.Multimedia.StereoHandler.StereoType stereoType
                    = HTC.UnityPlugin.Multimedia.StereoHandler.StereoType.SIDE_BY_SIDE;
                if (stereoSurface.name == "UpSurface")
                {
                    stereoType = HTC.UnityPlugin.Multimedia.StereoHandler.StereoType.TOP_DOWN;
                }
                HTC.UnityPlugin.Multimedia.StereoHandler.SetStereoPair(
                    stereoSurface,
                    stereoSurface2,
                    movieRenderer.material,
                    stereoType,
                    true);
            }
            mediaDecoder.onInitComplete = new UnityEvent();
            mediaDecoder.onInitComplete.AddListener(OnPrepareComplete);
            mediaDecoder.onVideoEnd = new UnityEvent();
            mediaDecoder.onVideoEnd.AddListener(OnVideoPlayComplete);

            mediaDecoder.mediaPath = Application.streamingAssetsPath + "/" + videoFile;
            yield return(null);
#else
            audioSource = gameObject.AddComponent <AudioSource>();

            if (!Path.GetExtension(videoFile).Equals(".ogv") &&
                !Path.GetExtension(videoFile).Equals(".ogg"))
            {
                if (File.Exists(
                        Application.streamingAssetsPath + "/" +
                        Path.GetDirectoryName(videoFile) + "/" +
                        Path.GetFileNameWithoutExtension(videoFile) + ".ogv"
                        ))
                {
                    videoFile = Path.GetDirectoryName(videoFile) + "/" +
                                Path.GetFileNameWithoutExtension(videoFile) + ".ogv";
                }
                else if (File.Exists(
                             Application.streamingAssetsPath + "/" +
                             Path.GetDirectoryName(videoFile) + "/" +
                             Path.GetFileNameWithoutExtension(videoFile) + ".ogg"
                             ))
                {
                    videoFile = Path.GetDirectoryName(videoFile) + "/" +
                                Path.GetFileNameWithoutExtension(videoFile) + ".ogg";
                }
                else
                {
                    UpdateState(StateType.Error);
                    throw new Exception("Only support ogv/ogg video format on Standalone platform.");
                }
            }
            WWW wwwReader = new WWW("file:///" + Application.streamingAssetsPath + "/" + videoFile);
            yield return(wwwReader);

            if (wwwReader.error != null)
            {
                UpdateState(StateType.Error);
                Debug.LogError(TAG + " wwwReader error: " + wwwReader.error);
            }
            // Here is an issue in Unity Editor, please ignore the error if you
            // see the error below in console:
            // LoadMoveData got NULL!
            // Error: Cannot create FMOD::Sound instance for resource (null), (An invalid parameter was passed to this function. )
            //
            // Issue:
            // https://issuetracker.unity3d.com/issues/calling-www-dot-movie-fails-to-load-and-prints-error-loadmovedata-got-null
            // https://issuetracker.unity3d.com/issues/movietexture-fmod-error-when-trying-to-play-video-using-www-class
            movieTexture = wwwReader.movie;
            movieRenderer.material.mainTexture = movieTexture;
            audioSource.clip  = movieTexture.audioClip;
            movieTexture.loop = loop;
#endif
            UpdateState(StateType.Initialized);
            StartCoroutine(Prepare());
        }