Uso de la nueva API Unity VideoPlayer y VideoClip para reproducir video

MovieTexture finalmente está en desuso después del lanzamiento de Unity 5.6.0b1 y ahora se ha lanzado una nueva API que reproduce videos tanto en dispositivos de escritorio como en dispositivos móviles.

VideoPlayer y VideoClip se pueden usar para reproducir video y recuperar la textura de cada cuadro si es necesario.

Logré hacer funcionar el video, pero no pude escuchar el audio del Editor en Windows 10. ¿Alguien sabe por qué no se reproduce el audio?

//Raw Image to Show Video Images [Assign from the Editor] public RawImage image; //Video To Play [Assign from the Editor] public VideoClip videoToPlay; private VideoPlayer videoPlayer; private VideoSource videoSource; //Audio private AudioSource audioSource; // Use this for initialization void Start() { Application.runInBackground = true; StartCoroutine(playVideo()); } IEnumerator playVideo() { //Add VideoPlayer to the GameObject videoPlayer = gameObject.AddComponent(); //Add AudioSource audioSource = gameObject.AddComponent(); //Disable Play on Awake for both Video and Audio videoPlayer.playOnAwake = false; audioSource.playOnAwake = false; //We want to play from video clip not from url videoPlayer.source = VideoSource.VideoClip; //Set video To Play then prepare Audio to prevent Buffering videoPlayer.clip = videoToPlay; videoPlayer.Prepare(); //Wait until video is prepared while (!videoPlayer.isPrepared) { Debug.Log("Preparing Video"); yield return null; } Debug.Log("Done Preparing Video"); //Set Audio Output to AudioSource videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource; //Assign the Audio from Video to AudioSource to be played videoPlayer.EnableAudioTrack(0, true); videoPlayer.SetTargetAudioSource(0, audioSource); //Assign the Texture from Video to RawImage to be displayed image.texture = videoPlayer.texture; //Play Video videoPlayer.Play(); //Play Sound audioSource.Play(); Debug.Log("Playing Video"); while (videoPlayer.isPlaying) { Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time)); yield return null; } Debug.Log("Done Playing Video"); } 

Encontrado el problema A continuación se muestra el código FIJO que reproduce video y audio:

 //Raw Image to Show Video Images [Assign from the Editor] public RawImage image; //Video To Play [Assign from the Editor] public VideoClip videoToPlay; private VideoPlayer videoPlayer; private VideoSource videoSource; //Audio private AudioSource audioSource; // Use this for initialization void Start() { Application.runInBackground = true; StartCoroutine(playVideo()); } IEnumerator playVideo() { //Add VideoPlayer to the GameObject videoPlayer = gameObject.AddComponent(); //Add AudioSource audioSource = gameObject.AddComponent(); //Disable Play on Awake for both Video and Audio videoPlayer.playOnAwake = false; audioSource.playOnAwake = false; //We want to play from video clip not from url videoPlayer.source = VideoSource.VideoClip; //Set Audio Output to AudioSource videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource; //Assign the Audio from Video to AudioSource to be played videoPlayer.EnableAudioTrack(0, true); videoPlayer.SetTargetAudioSource(0, audioSource); //Set video To Play then prepare Audio to prevent Buffering videoPlayer.clip = videoToPlay; videoPlayer.Prepare(); //Wait until video is prepared while (!videoPlayer.isPrepared) { Debug.Log("Preparing Video"); yield return null; } Debug.Log("Done Preparing Video"); //Assign the Texture from Video to RawImage to be displayed image.texture = videoPlayer.texture; //Play Video videoPlayer.Play(); //Play Sound audioSource.Play(); Debug.Log("Playing Video"); while (videoPlayer.isPlaying) { Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time)); yield return null; } Debug.Log("Done Playing Video"); } 

Por qué Audio no se estaba reproduciendo:

 //Set Audio Output to AudioSource videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource; //Assign the Audio from Video to AudioSource to be played videoPlayer.EnableAudioTrack(0, true); videoPlayer.SetTargetAudioSource(0, audioSource); 

debe llamarse antes de videoPlayer.Prepare(); no después de eso Esto tomó horas de experimento para descubrir que este era el problema que estaba teniendo.


Atrapado en “Preparing Video”?

Espere 5 segundos después de videoPlayer.Prepare(); se llama luego salir del ciclo while.

Reemplazar:

 while (!videoPlayer.isPrepared) { Debug.Log("Preparing Video"); yield return null; } 

con:

 //Wait until video is prepared WaitForSeconds waitTime = new WaitForSeconds(5); while (!videoPlayer.isPrepared) { Debug.Log("Preparing Video"); //Prepare/Wait for 5 sceonds only yield return waitTime; //Break out of the while loop after 5 seconds wait break; } 

Esto debería funcionar, pero puede experimentar almacenamiento en búfer cuando el video comienza a reproducirse. Al usar esta solución temporal, mi sugerencia es presentar un error con el título “videoPlayer.isPrepared always true” porque es un error.

Algunas personas también lo arreglaron cambiando:

 videoPlayer.playOnAwake = false; audioSource.playOnAwake = false; 

a

 videoPlayer.playOnAwake = true; audioSource.playOnAwake = true; 

Reproducir video desde URL:

Reemplazar:

 //We want to play from video clip not from url videoPlayer.source = VideoSource.VideoClip; 

con:

 //We want to play from url videoPlayer.source = VideoSource.Url; videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4"; 

luego Eliminar :

public VideoClip videoToPlay; y videoPlayer.clip = videoToPlay; ya que estos ya no son necesarios.

Play Video From StreamingAssets folder:

 string url = "file://" + Application.streamingAssetsPath + "/" + "VideoName.mp4"; if !UNITY_EDITOR && UNITY_ANDROID url = Application.streamingAssetsPath + "/" + "VideoName.mp4"; #endif //We want to play from url videoPlayer.source = VideoSource.Url; videoPlayer.url = url; 

Todos los formatos de video compatibles :

  • ovv
  • vp8
  • webm
  • mov
  • dv
  • mp4
  • m4v
  • mpg
  • mpeg

Formatos de video admitidos adicionales en Windows :

  • avi
  • asf
  • wmf

Algunos de estos formatos no funcionan en algunas plataformas. Consulte esta publicación para obtener más información sobre los formatos de video compatibles.

Similar a lo que las otras respuestas han estado diciendo. Podría usar devoluciones de llamada para cuando prepare y finalice los estados de video. En lugar de utilizar corutinas y retorno de rendimiento.

 videoPlayer.loopPointReached += EndReached; videoPlayer.prepareCompleted += PrepareCompleted; void PrepareCompleted(VideoPlayer vp) { vp.Play(); } void EndReached(VideoPlayer vp) { // do something } 

Usé la respuesta de @Programmer para reproducir videos de una URL, pero no pude escuchar ningún sonido. Eventualmente encontré la respuesta en los comentarios de un tutorial de YouTube.

Para que el audio se reproduzca para una película cargada mediante URL, debe agregar la siguiente línea antes de la llamada a EnableAudioTrack :

 videoPlayer.controlledAudioTrackCount = 1; 

Por ahora, VideoPlayer debe actualizarse lo suficiente como para que no necesite escribir código para poder trabajar correctamente. Aquí están las configuraciones que encontré para tener el efecto más deseable: Configuraciones Óptimas

Estas configuraciones son:

Reproductor de video :

  • Play On Awake: True
  • Espere al primer fotogtwig: falso
  • Modo de salida de audio: ninguno

Fuente de audio :

  • Play On Awake: True

No olvides tener un VideoClip para VideoPlayer y un AudioClip para AudioSource. Los formatos de archivo que encontré que funcionan mejor son .ogv para video y .wav para audio.