MovieTexture ist nach der Veröffentlichung von Unity 5.6.0b1 endgültig veraltet, und eine neue API, die Video auf Desktop- und Mobilgeräten abspielt, ist jetzt freigegeben.
Mit VideoPlayer und VideoClip können Sie bei Bedarf Video abspielen und Textur für jeden Frame abrufen.
Ich habe es geschafft, das Video zum Laufen zu bringen, aber es ist nicht möglich, das Audiomaterial vom Editor unter Windows 10 abzuspielen. Weiß jemand, warum Audio nicht abgespielt wird?
//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<VideoPlayer>();
//Add AudioSource
audioSource = gameObject.AddComponent<AudioSource>();
//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");
}
Das Problem gefunden. Hier ist der -CODE F&UUML;R, der Video und Audio abspielt:
//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<VideoPlayer>();
//Add AudioSource
audioSource = gameObject.AddComponent<AudioSource>();
//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");
}
Warum wurde kein Audio abgespielt:
//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);
muss vor videoPlayer.Prepare();
aufgerufen werden, nicht danach. Es dauerte Stunden des Experiments, um herauszufinden, dass dies das Problem war, das ich hatte.
Bei "Video vorbereiten" hängen geblieben?
Warten Sie nach dem Aufruf von videoPlayer.Prepare();
5 Sekunden, und beenden Sie die while-Schleife.
Ersetzen:
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
yield return null;
}
mit:
//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;
}
Dies sollte funktionieren, es kann jedoch zu Pufferungen kommen, wenn das Video abgespielt wird. Bei der Verwendung dieses temporären Fixes empfehle ich, einen Fehler mit dem Titel "videoPlayer.isPrepared immer true" zu erstellen, da dies ein Fehler ist.
Einige Personen korrigierten es auch durch Ändern:
videoPlayer.playOnAwake = false;
audioSource.playOnAwake = false;
zu
videoPlayer.playOnAwake = true;
audioSource.playOnAwake = true;
Video von URL abspielen:
Ersetzen:
//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;
mit:
//We want to play from url
videoPlayer.source = VideoSource.Url;
videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";
dann entfernen:
public VideoClip videoToPlay;
und videoPlayer.clip = videoToPlay;
, da diese nicht mehr benötigt werden.
Play Video aus dem Ordner "StreamingAssets":
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;
Alle unterstützten Videoformate:
Zusätzliche unterstützte Videoformate unter Windows:
Einige dieser Formate funktionieren auf einigen Plattformen nicht. Weitere Informationen zu unterstützten Videoformaten finden Sie unter this post.
Ähnlich wie in den anderen Antworten. Sie können Rückrufe für die Vorbereitung und das Beenden von Videostatus verwenden. Anstatt Coroutinen und Rendite zu verwenden.
videoPlayer.loopPointReached += EndReached;
videoPlayer.prepareCompleted += PrepareCompleted;
void PrepareCompleted(VideoPlayer vp) {
vp.Play();
}
void EndReached(VideoPlayer vp) {
// do something
}
Ich habe die Antwort von @Programmer verwendet, um Videos von einer URL abzuspielen, konnte jedoch keinen Ton zum Abspielen wiedergeben. Schließlich fand ich die Antwort in den Kommentaren eines YouTube-Tutorials.
Damit das Audio für einen über eine URL geladenen Film abgespielt werden kann, müssen Sie vor dem Aufruf von EnableAudioTrack
die folgende Zeile hinzufügen:
videoPlayer.controlledAudioTrackCount = 1;