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 }
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()); }