Синхронизация даты с часовым поясом и сохранение значения часового пояса [дубликат]

Нашел проблему. Ниже приведен код 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();

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

Почему звук не воспроизводится:

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

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

0
задан Vamsi K.N 17 May 2017 в 08:57
поделиться

1 ответ

java.util.Date не хранит информацию о часовом поясе.

Чтобы сохранить часовой пояс, используйте ZonedDateTime или OffsetDateTime (Java 8 +).

Поскольку ваша строка даты - ISO 8601 , вам даже не нужно указывать формат даты.

ZonedDateTime zdt = ZonedDateTime.parse("2017-06-14T04:00:00-08:00");
System.out.println(zdt); // prints: 2017-06-14T04:00-08:00
OffsetDateTime odt = OffsetDateTime.parse("2017-06-14T04:00:00-08:00");
System.out.println(odt); // prints: 2017-06-14T04:00-08:00

Для pre-Java 8 используйте ThreeTen-Backport :

ThreeTen-Backport обеспечивает обратную передачу Java SE 8 date- классы времени для Java SE 6 и 7.

1
ответ дан Andreas 19 August 2018 в 10:43
поделиться
  • 1
    Пока ZonedDateTime технически работает, OffsetDateTime подходит. Часовой пояс - это история изменений смещения, используемых конкретной областью. – Basil Bourque 17 May 2017 в 07:59
  • 2
    @BasilBourque Использование ZonedDateTime отлично действует, поскольку -08:00 является допустимым часовым поясом. Часовой пояс является надмножеством смещения зоны, или, скорее, ZoneOffset является подклассом (ограничением) ZoneId. – Andreas 17 May 2017 в 08:02
  • 3
    Тогда почему у нас есть класс OffsetDateTime? И, нет, -08:00 является не часовым поясом. America/Los_Angeles - часовой пояс. Эта зона имеет смещение части -08:00 года и -07:00 в другой части года. Эти изменения в смещении с течением времени, их история в прошлом, текущее смещение на данный момент и запланированные изменения смещения, запланированные в будущем, что набор смещений для этого одного региона является часовым поясом. Поэтому ваше использование ZonedDateTime в этом ответе вводит в заблуждение, запутывает и не соответствует входным данным. В противном случае хороший ответ, если вы удалите ZonedDateTime. – Basil Bourque 17 May 2017 в 08:10
  • 4
    @Andreas Спасибо за решение, но, к сожалению, мы не используем JAVA 8 – Vamsi K.N 17 May 2017 в 08:52
  • 5
    @BasilBourque Только для зоны ZoneId с плавающей точкой является вполне допустимым ZoneId, поэтому использование ZonedDateTime также является вполне допустимым. Конечно, вы можете ограничить его только смещением, используя OffsetDateTime, и если вы знаете, что вход будет только когда-либо, это может быть хорошей идеей, но использование ZonedDateTime не является неверным или вводящим в заблуждение ответом, и вход идеально подходит для ZonedDateTime. Это по-прежнему хороший / полезный ответ, даже с ZonedDateTime в нем. – Andreas 17 May 2017 в 09:25
Другие вопросы по тегам:

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