Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 6
1

Синхронизируемый видеоплеер

18.01.2022, 11:25. Показов 270. Ответов 0

Author24 — интернет-сервис помощи студентам
Всем привет, занимаюсь разработкой кроссплатформенного(windows, android(Oculus quest)) онлайн видеоплеера.
Общий пайплайн представляется мне так:
- Пользователь открывает видео.
- Локально подгружает его себе
- Нажимает кнопку расшаривания
- Все остальные пользователи ловят ссылку на видео.
- Расшаривающий пользователь, и подгружающие, запускают корутину, в которой ждут всех
- После загрузки всеми пользователями начинает играть видео.


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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
SharedInfo.Changed += (info) => {
                Log($"Shared url: {(info == null ? null : info.Url)}");
                StopAllCoroutines();
                if (info == null) return;
 
                if (sharedFirstTime && PlayerBase.Players.Count < 2 && (DateTime.Now - info.SendTime).TotalSeconds > 2f) {
                    SharedInfo.Value = YoutubeUrl.Video("", false);
                    return;
                }
                sharedFirstTime = false;
                PlayerBase.LocalPlayer.ReadyToPlay.Value = false;
 
                if (!LooksLikeYoutubeUrl(info.Url)) {
                    Log("Stop share");
                    if (info.Is360) {
                        if (IsSimulated) {
                            for (int i = 0; i < PlayerBase.Players.Count; ++i) {
                                var player = PlayerBase.Players[i];
                                var position = SpawnPoints.Instance.GetEmptySpawnPoint();
                                player.ForcedTeleportPosition.Value = position;
                            }
                        }
                    }
 
                    Stop();
                    CinemaPlayer.Instance.Sphere.SetActive(false);
                    foreach (var screen in BigScreen.Screens)
                        screen.Mode = BigScreenMode.Off;
 
                    StartStopShare?.Invoke(false);
                    return;
                }
 
                if (IsPlayingNow && info.Initiator != Auth.Account.UserId) Stop();
                else if (info.Initiator == Auth.Account.UserId) Stop(true);
 
               
                Log("Prepared, go load");
                StartCoroutine(DoWaitForAllPlayers());
                Play(info.Url, info.IsVideo, Quality.Highest, info.Is360);
            };
 
....
 
public IEnumerator DoWaitForAllPlayers() {
            float timer = 25f;
            Log("Start wait all players");
            while (!CheckReadyPlayers()) {
                ShowModal?.Invoke(Localization.Active.WaitingPlayersForShare + "\n" + NotReadyPlayers, false);
                yield return new WaitForSeconds(0.1f);
                if (IsOwner) {
                    timer -= Time.deltaTime;
                    if (timer <= 0) {
                        Log("Restart loading");
                        var tmp = SharedInfo.Value;
                        SharedInfo.Value = YoutubeUrl.Video("", false);
                        yield return new WaitForSeconds(0.5f);
                        SharedInfo.Value = YoutubeUrl.Video(tmp.Url, tmp.Is360);
                        yield break;
                    }
                }
            }
            HideModal?.Invoke();
            Log("All players ready to play");
            yield return new WaitForSeconds(5f);
            if (IsOwner) SharedTime.Value = VideoPlayer.Control.GetCurrentTime();
            Resume();
            if (SharedTime.Value < AudioSource.time - 5 || SharedTime.Value > AudioSource.time + 5)
                SeekTo(SharedTime.Value);
        }
Некоторые люди доходят до лога "Prepared, go load", но не заходят в корутину DoWaitForAllPlayers, что видно по логу "Start wait all players".

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

Заранее спасибо за помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2022, 11:25
Ответы с готовыми решениями:

Синхронизируемый генератор
Здравствуйте! Подскажите, пожалуйста, схему генератора прямоугольных импульсов, при подаче на вход...

Видеоплеер на JS
Учусь HTML5 по учебнику Гоше.После ввода JS,далее пишется видеоплеер на нём.Написал(или правильнее...

Видеоплеер
Доброго времени суток! У меня есть вопрос: как создать в WPF видеоплеер, чтобы это было не так...

Видеоплеер
Пробегитесь по коду при выборе первым видео из ComboBox-а, а затем если надо выбрать через...

Видеоплеер
Подскажите плагин, который поддерживает воспроизведение видеофайлов без возможности перемотки,...

0
18.01.2022, 11:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2022, 11:25
Помогаю со студенческими работами здесь

Видеоплеер
по видеоуроку с Youtube создавал видеоплеер ( один с елементов курсача) организовал все методы...

Видеоплеер
Получила задание, написать сайт для просмотра видео. нельзя использовать HTML &lt;Video&gt; таг, надо при...

видеоплеер
кто нибудь может подсказать как сделать так, чтобы видео можно было проигрывать в Edit?

VK Видеоплеер
Есть ли у SDK vk.com плеер для андройда? Дайте ссылку или пример.

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

Видеоплеер
Можно ли такое сделать в VBA ??? Чтобы с помощью VB смотреть видео, сделаем программу. На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru