wake-up-neo.com

Verwenden des neuen Unity VideoPlayer und der VideoClip-API zum Abspielen von Videos

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");
}
35
Programmer

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:

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

Zusätzliche unterstützte Videoformate unter Windows:

  • avi
  • asf
  • wMF

Einige dieser Formate funktionieren auf einigen Plattformen nicht. Weitere Informationen zu unterstützten Videoformaten finden Sie unter this post.

54
Programmer

Ä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
}
6
Groshh

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;
1
TarkaDaal