Использование нового Unity VideoPlayer и VideoClip API для воспроизведения видео

MovieTexture, наконец, устарел после Unity 5.6.0b1 релиз и новый API, который воспроизводит видео на настольных и мобильных устройствах теперь выпущен.

Видеоплеер и клип может использоваться для воспроизведения видео и получения текстуры для каждого кадра, если это необходимо.

мне удалось заставить видео работать, но coduldn't получить звук для воспроизведения, а также из редактора в Windows 10. Кто-нибудь знает, почему аудио не играет?

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

4 ответов


нашел проблему. Ниже находится основные код, который воспроизводит видео и аудио:

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

почему аудио не играл:

//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);

должен быть вызван перед videoPlayer.Prepare(); не после него. Это заняло несколько часов эксперимента, чтобы найти это, это была проблема, с которой я столкнулся.


застрял в "подготовке видео"?

подождите 5 секунд после videoPlayer.Prepare(); вызывается затем выйти из цикла while.

заменить:

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

С:

//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;
}

это должно работать, но вы можете испытать буферизацию, когда видео начинает играть. При использовании этого временного исправления, мое предложение, чтобы файл для ошибки с названием " видеоплеер.isPrepared всегда true", потому что это ошибка.

некоторые человек также исправлено путем изменения:

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

to

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

Воспроизведение Видео С URL-адрес:

заменить:

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

С:

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

затем удалить:

public VideoClip videoToPlay; и videoPlayer.clip = videoToPlay; как это не нужен.

воспроизведение видео из папки 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;

все поддерживаемое видео форматы:

  • ogv
  • VP8 и аудиокодек
  • формат WebM
  • mov
  • dv
  • МР4
  • m4v
  • mpg
  • в формате MPEG

дополнительные поддерживаемые форматы видео в Windows:

  • avi
  • asf
  • wmf

некоторые из этих форматов не работать на некоторых платформах. Видеть этой сообщение для получения дополнительной информации о поддерживаемых видеоформатах.


похоже на то, что говорили другие ответы. Вы можете использовать обратные вызовы при подготовке и завершении состояний видео. Вместо использования сопрограмм и возврата.

videoPlayer.loopPointReached += EndReached;
videoPlayer.prepareCompleted += PrepareCompleted;

void PrepareCompleted(VideoPlayer vp) {
    vp.Play();
}

void EndReached(VideoPlayer vp) {
    // do something
}

я использовал ответ @Programmer для воспроизведения видео с URL-адреса, но я не мог получить никакого звука для воспроизведения. В конце концов я нашел ответ в комментарии учебника YouTube.

чтобы получить аудио для воспроизведения фильма, загруженного через URL, вам нужно добавить следующую строку перед вызовом EnableAudioTrack:

videoPlayer.controlledAudioTrackCount = 1;

к настоящему времени Видеоплеер должен быть обновлен достаточно, вам не нужно писать код, чтобы правильно работать. Вот настройки, которые я нашел, чтобы иметь наиболее желаемый эффект: Optimal Settings

эти параметры:

Видео-Плеер:

  • Играть На Awake:правда
  • Подождите Первого Кадра:False
  • Режим Аудиовыхода: нет

Источник Звука:

  • Играть На Awake:правда

Не забудьте иметь видеоклип для видеоплеера и аудиоклип для Аудиоисточника. Форматы файлов, которые я нашел для работы лучше всего .ogv для видео и .WAV для аудио.