Unity VideoPlayer - isPrepared () & hellip; никогда не готовится [дубликат]

Это старый вопрос, но я добавил бы что-то потенциально полезное:

Я знаю, что вы написали свой пример в сырых списках Python, но если вы решили вместо этого использовать numpy массивы (что было бы прекрасно законным в вашем примере, потому что вы, похоже, имеете дело с массивами чисел), есть (почти точно) эта команда, которую вы сказали, что вы составили:

import numpy as np
np.set_printoptions(precision=2)

Или еще лучше в вашем случае, если вы все еще хотите видеть все десятичные числа действительно точных чисел, но, например, избавиться от конечных нулей, используйте строку форматирования %g:

np.set_printoptions(formatter={"float_kind": lambda x: "%g" % x})

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

29
задан Programmer 14 December 2016 в 14:38
поделиться

4 ответа

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

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

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

Некоторые люди также исправили его изменение:

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

-

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
  • mp4
  • m4v
  • mpg
  • mpeg

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

  • avi
  • asf
  • wmf

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

48
ответ дан Programmer 16 August 2018 в 11:37
поделиться
  • 1
    Я попытался использовать ваш код для воспроизведения видео на Unity 5.6.0b10, добавив видео .ogv. Но когда я нажимаю игру, я могу видеть только готовое видео на консоли. И меня тоже смущает, что GameObject должен быть RawImage, и что должно быть на изображении? Можете ли вы помочь мне решить мою проблему? – Luzan Baral 8 March 2017 в 12:09
  • 2
    Извините за то, что вы все время и время звонили вам, но для меня видео не воспроизводилось, и из-за videoPlayer.playOnAwake = false; audioSource.playOnAwake = false; я изменил значения на true. Я понял, теперь мне нужно разработать скрипт для управления воспроизведением и паузой для видео. – Luzan Baral 8 March 2017 в 13:09
  • 3
    Я так не думаю, но если вы можете сохранить видео на любом из этих сервисов с URL-адресом, который заканчивается на .mp4 или действительным именем видеофайла, тогда вы сможете его воспроизвести. Помните, что эти услуги не предназначены для этого. Для этого вам нужен выделенный сервер, так как потоковое видео очень дорого. Когда я говорю «дорогой», я имею в виду пропускную способность. – Programmer 11 April 2017 в 07:10
  • 4
    @Harschell Пожалуйста, напишите сообщение об ошибке, если это не сработает для вас. – Programmer 8 June 2017 в 14:34
  • 5
    @Bluetree Да. Новый VideoPlayer должен работать на любой платформе. – Programmer 1 December 2017 в 10:02
  • 6
    – Suraksha Ajith 20 August 2018 в 10:04

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

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

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

void EndReached(VideoPlayer vp) {
    // do something
}
6
ответ дан Groshh 16 August 2018 в 11:37
поделиться
  • 1
    Конечно, есть еще несколько звуковых ошибок, с которыми я столкнулся. Где я нашел, используя методы обратного вызова, у меня было много головных болей. В частности, если вы пытаетесь воспроизвести одно видео за другим. – Groshh 28 April 2017 в 09:30
  • 2
    Это звучит как гораздо более разумное решение, чем сопрограммы – shieldgenerator7 5 December 2017 в 20:50

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

Эти настройки:

Видеоплеер:

  • Play On Awake: True
  • Ожидание первого кадра: False
  • Режим аудиовыхода: None

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

  • Play On Awake: True

Не забудьте иметь VideoClip для VideoPlayer и AudioClip для AudioSource. Форматы файлов, которые, как я считаю, работают лучше всего: .ogv для видео и .wav для аудио.

-2
ответ дан shieldgenerator7 16 August 2018 в 11:37
поделиться
  • 1
    «VideoPlayer должен быть обновлен достаточно, вам не нужно писать код для правильной работы» Не совсем. Вам все равно нужно написать код на некоторых платформах и некоторые (длинные) видео, иначе видео будет замерзать. Исправление вызывает функцию Prepare(), которая может быть выполнена только из кода. – Programmer 12 December 2017 в 09:13
  • 2
    Хороший момент. У меня было только короткое видео, поэтому мне не нужен код, чтобы он играл при запуске – shieldgenerator7 13 December 2017 в 10:27

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

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

videoPlayer.controlledAudioTrackCount = 1;
1
ответ дан TarkaDaal 16 August 2018 в 11:37
поделиться
  • 1
    Интересно. У вас не было проблем с аудио из видеороликов, но это будет полезно для других. Это может быть ошибка в редакторе. – Programmer 10 July 2018 в 13:34
Другие вопросы по тегам:

Похожие вопросы: