Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Заблокирован

Dash плеер, как управлять качеством?

07.07.2024, 00:25. Показов 851. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP/HTML
1
2
3
4
5
6
7
<div style='width: 500px'>
    <video src='' style='width: 100%' controls></video>
</div>
<script src="https://cdn.dashjs.org/v3.1.0/dash.all.min.js" rel="preload"></script>
<script>
   (pl = dashjs.MediaPlayer().create()).initialize(document.querySelector('video'), 'https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd', true);
</script>
Создал простенький плеер, даже научился конвертировать видео в необходимый формат.

Мой манифест
XML
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
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:mpeg:dash:schema:mpd:2011"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd"
    profiles="urn:mpeg:dash:profile:isoff-live:2011"
    type="static"
    mediaPresentationDuration="PT1M0.0S"
    maxSegmentDuration="PT10.0S"
    minBufferTime="PT20.0S">
    <ProgramInformation>
    </ProgramInformation>
    <ServiceDescription id="0">
    </ServiceDescription>
    <Period id="0" start="PT0.0S">
        <AdaptationSet id="0" contentType="video" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true" frameRate="25/1" maxWidth="1920" maxHeight="1080" par="16:9" lang="eng">
            <Representation id="0" mimeType="video/mp4" codecs="avc1.4d401e" bandwidth="800000" width="640" height="360" sar="1:1">
                <SegmentTemplate timescale="1000000" duration="10000000" initialization="init-$RepresentationID$.m4s" media="chunk-$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
            <Representation id="1" mimeType="video/mp4" codecs="avc1.4d401e" bandwidth="1400000" width="768" height="432" sar="1:1">
                <SegmentTemplate timescale="1000000" duration="10000000" initialization="init-$RepresentationID$.m4s" media="chunk-$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
            <Representation id="2" mimeType="video/mp4" codecs="avc1.4d401f" bandwidth="2000000" width="960" height="540" sar="1:1">
                <SegmentTemplate timescale="1000000" duration="10000000" initialization="init-$RepresentationID$.m4s" media="chunk-$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
            <Representation id="3" mimeType="video/mp4" codecs="avc1.4d401f" bandwidth="2800000" width="1280" height="720" sar="1:1">
                <SegmentTemplate timescale="1000000" duration="10000000" initialization="init-$RepresentationID$.m4s" media="chunk-$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
            <Representation id="4" mimeType="video/mp4" codecs="avc1.4d4028" bandwidth="5000000" width="1920" height="1080" sar="1:1">
                <SegmentTemplate timescale="1000000" duration="10000000" initialization="init-$RepresentationID$.m4s" media="chunk-$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
        <AdaptationSet id="1" contentType="audio" startWithSAP="1" segmentAlignment="true" bitstreamSwitching="true" lang="eng">
            <Representation id="5" mimeType="audio/mp4" codecs="mp4a.40.2" bandwidth="128000" audioSamplingRate="48000">
                <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
                <SegmentTemplate timescale="1000000" duration="10000000" initialization="init-$RepresentationID$.m4s" media="chunk-$RepresentationID$-$Number%05d$.m4s" startNumber="1">
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>

Все перепробывал, так и не смог разобраться...
  1. Как получить в js массив доступных качеств из манифеста?
  2. Как узнать какое качество играет в данный момент?
  3. Как переключиться на другое качество?
  4. Как включить и отключить автоопределения качества?
  5. Как указать какое качество изначально включать при подгрузке плеера?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.07.2024, 00:25
Ответы с готовыми решениями:

MPEG DASH плеер на Android
Нужно сделать MPEG DASH плеер на Android. Подскажите, если кто с подобным уже сталкивался.

Создать класс "Плеер", с помощью которого можно управлять списком треков
Создать класс Плеер, с помощью которого можно управлять списком треков (создать класс Трек за полями: Название трека, продолжительность)....

плеер YouTube работает как мини плеер
при открытии видео в странице просмотра появляются значки мини плеера ютуба. Если оновить страницу все станет норм, но при воспоизведении...

13
409 / 301 / 112
Регистрация: 28.08.2013
Сообщений: 787
07.07.2024, 14:09
Цитата Сообщение от Dmit199 Посмотреть сообщение
Как получить в js массив доступных качеств из манифеста?
Как узнать какое качество играет в данный момент?
Как переключиться на другое качество?
Как включить и отключить автоопределения качества?
Как указать какое качество изначально включать при подгрузке плеера?
И не нужно. Этим всем занимается браузер. В MPD-файле (XML) есть свойство "bandwidth", по нему браузер ориентируется какое качество видео качать, в зависимости от скорости поступления данных в браузер (не сети). Если пользователь выбрал какое-то определенной качество, браузер будет качать и показывать именно это качество.
Для теста, добавь на другую станицу некий JS код (или запусти какой-то бэнчмарк), который будет сильно грузить процессор, и браузер сам выберет менее качественное видео, ориентируясь на ту скорость данных, что доступна.
1
Заблокирован
08.07.2024, 00:52  [ТС]
Цитата Сообщение от kidASM Посмотреть сообщение
Если пользователь выбрал какое-то определенной качество
В том то и дело...

Как сделать менюшку выбора качества для пользователя?

Добавлено через 3 часа 48 минут
Пытаюсь разобраться в этом, ничего не понимаю...

Элементарно, не знаю как получить массив доступных качеств из манифеста. Какие бы get запросы из доков не пытался выполнить. Возвращают 0, либо ошибку...(нет такой команды)

https://cdn.dashjs.org/latest/jsdoc/

У меня только данный скрипт подключен(dash.all.min.js). Быть может еще какие подключать необходимо для выполнения команд?

Добавлено через 47 минут
Скачал архив https://github.com/Dash-Industry-Forum/dash.js

Так понимаю, мне необходимо какие та скрипты дополнительно подключать?

Какие бы не пытался подключить, везде пишет
Code
1
SyntaxError: Cannot use import statement outside a module
Пути разные пытался указывать, относительные,полные, с доменом. Всегда одна и таже ошибка....


Хелпс
0
 Аватар для voraa
1238 / 1133 / 178
Регистрация: 21.01.2024
Сообщений: 5,148
08.07.2024, 08:29
Цитата Сообщение от Dmit199 Посмотреть сообщение
Какие бы не пытался подключить, везде пишет
КодВыделить код
SyntaxError: Cannot use import statement outside a module
Пути разные пытался указывать, относительные,полные, с доменом. Всегда одна и таже ошибка....
А вы переведите и попытайтесь понять смысл этого сообщения. Или хотя бы загуглите его.
1
Заблокирован
10.07.2024, 01:20  [ТС]
Сделал, одна ошибка пропала, вторая

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div id='player'><svg viewBox='0 0 36 36' id='mt'><path d='M35.716 31.884a1.349 1.349 0 0 1-1.895.23L.517 6.011a1.35 1.35 0 1 1 1.667-2.125l33.252 26.05c.635.512.742 1.362.28 1.947z' fill='red'></path><path d='M3.6 15.3v5.4c0 1.492 1.21 2.65 2.7 2.65h4.717l7.589 6.745c.335.349.763.506 1.196.506.25 0 .504-.052.74-.16.65-.29 1.06-.931 1.06-1.64v-2.832L4.993 12.954c-.827.461-1.392 1.283-1.392 2.346zm16.945-9.741a1.803 1.803 0 0 0-1.937.296l-6.519 5.794 9.513 7.46V7.198c0-.708-.41-1.4-1.057-1.64zm6.266 8.273a1.35 1.35 0 0 0-1.708 2.092c.634.523 1 1.277 1 2.076a2.68 2.68 0 0 1-1.002 2.075 1.35 1.35 0 0 0-.44 1.428l1.21.95c.029.001.055.018.084.018.3 0 .604-.1.854-.304A5.37 5.37 0 0 0 28.803 18c0-1.614-.726-3.128-1.992-4.168zm3.404-4.158a1.35 1.35 0 1 0-1.712 2.088c1.909 1.563 3 3.836 3 6.238 0 2.402-1.094 4.674-2.999 6.239-.059.048-.09.114-.138.17l2.126 1.666c2.355-2.067 3.711-4.987 3.711-8.075 0-3.212-1.451-6.25-3.988-8.326z'></path></svg><video></video><div id='prg'></div></div>
<style>
   #player { max-width: 900px; margin: auto;  top: 30%; position: relative; width: 40%; box-shadow: 0 0 25px black}
   #player video { background: #ffffff; display: block; margin: auto; width: 100%;}
   #prg { position: absolute; bottom: 0; left: 0; width: 0; height: 5px; background: rgb(219 212 0);}
   #mt { display: block; fill: #000; background: #fff; padding: 5px; border-radius: 5px; height: clamp(50px, 10%, 100px); position: absolute; left: 10px; top: 10px; opacity: 1 !important; filter: drop-shadow(0 0 2px rgb(0, 0, 0, 31%)); cursor: pointer; z-index: 10;}
</style>
 
 
<script src='/dash.js' type='module' rel='preload'></script>
<script type="module">
    window.addEventListener('DOMContentLoaded', _ => {
        import { mediaPlayerEvents } from './dash.js-development/src/streaming/MediaPlayer.js';
        let v = player.querySelector('video');
        (dashjs.MediaPlayer().create()).initialize(v, '/test/dash.mpd', true);
        v['play']()?.catch(_ =>  {v.volume = 0; v.play()});
        mt.onclick = e => {mt.remove(); v.volume = 1}
        v.ontimeupdate = e => {(pr = _ => {prg.style.width = v.currentTime / (v.duration / 100) + "%"; requestAnimationFrame(pr)})()};
    });
</script>
Читаю, пытаюсь и все равно не понимаю как это все должно работать. Сейчас ругается на скобку после импорта

Code
1
Uncaught SyntaxError: Unexpected token '{'
К примеру, пытаюсь сделать так чтобы команда getQualityFor. Заработала
https://cdn.dashjs.org/latest/... QualityFor

Судя по докам, мне необходимо импортировать скрипт который расположен в архиве по пути
Code
1
./dash.js-development/src/streaming/MediaPlayer.js
Что и делаю, сейчас ошибка со скобкой. Что та мне подсказывает, если ее исправить, там еще куча будет ошибок. Судя по том, что в файле MediaPlayer.js еще куча файлов импортируется...

Нужна ваша помощь, без вас никак...
0
 Аватар для voraa
1238 / 1133 / 178
Регистрация: 21.01.2024
Сообщений: 5,148
10.07.2024, 07:02
Цитата Сообщение от Dmit199 Посмотреть сообщение
Сейчас ругается на скобку после импорта
Операторы import должны быть в начале скрипта (файла) модуля, до любого другого оператора.
1
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,146
Записей в блоге: 14
10.07.2024, 09:42
Dmit199, ваш пример из первого поста уже работает и содержит все функции
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
<div style='width: 500px'>
    <video src='' style='width: 100%' controls></video>
</div>
<script src="https://cdn.dashjs.org/v3.1.0/dash.all.min.js" rel="preload"></script>
<script>
    const player = dashjs.MediaPlayer().create();
    player.initialize(document.querySelector('video'), 'https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd', true);
    // этот код я добавил для демонстрации что функция getQualityFor уже есть в плеере
    console.log(typeof player.getQualityFor) // function
</script>
</html>
В доке getQualityFor написано где посмотреть ее реализацию в исходниках, вы уже подключили сборку плеера со всеми функциями
1
Заблокирован
10.07.2024, 18:25  [ТС]
Работает, проблема была в том что строчку читает быстрее нежели файл подгружает

Сделал так

JavaScript
1
2
3
4
5
6
    const player = dashjs.MediaPlayer().create();
    player.initialize(document.querySelector('video'), 'https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd', true);
    // этот код я добавил для демонстрации что функция getQualityFor уже есть в плеере
    setInterval(() => {
        console.log(player.getQualityFor('video')) // function
    }, 1000);
Вопрос в том, как убрать интервал

https://cdn.dashjs.org/latest/... t:CAN_PLAY

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

JavaScript
1
player.oncan_play = _ =>  console.log('sdf');
Он не сробатывает, видео играет.


getQualityFor Не понимаю, ожидал получить массив доступных качеств в виде (144/240/360...) А отдает простую цифру, к примеру '9'...
0
 Аватар для voraa
1238 / 1133 / 178
Регистрация: 21.01.2024
Сообщений: 5,148
10.07.2024, 19:25
Цитата Сообщение от Dmit199 Посмотреть сообщение
Не понимаю, ожидал получить массив доступных качеств в виде (144/240/360...) А отдает простую цифру, к примеру '9'...
https://cdn.dashjs.org/latest/... QualityFor
Возвращает целое число. 0 - минимальный битрейт.
Надо искать, что эти числа означают.
Может быть это индекс в массиве, который возвращает getBitrateInfoListFor(type)
https://cdn.dashjs.org/latest/... nfoListFor
1
Заблокирован
10.07.2024, 20:59  [ТС]
JavaScript
1
2
3
4
5
6
    player.onload = _ => {
       console.log('sdf');
    }
    player.oninitialize = _ => {
       console.log('sdf');
    }
Пытаюсь повесить событие на то, как подгрузим плеер и данные.
К в примерах ни одно из них не работает, как быть?
0
 Аватар для voraa
1238 / 1133 / 178
Регистрация: 21.01.2024
Сообщений: 5,148
10.07.2024, 21:18
Цитата Сообщение от Dmit199 Посмотреть сообщение
Пытаюсь повесить событие на то, как подгрузим плеер и данные.
К в примерах ни одно из них не работает, как быть?
Не видя всей последовательности действий, трудно сказать что либо конкретное.
События надо вешать до того, как они могут произойти. Если вешать после того, как событие произошло, то обработчик не вызовется.
Я не знаю всей этой либы, но подозреваю, что событие player.oninitialize надо вешать до вызова player.initialize.
А как у вас сделано - не знаю.
1
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,146
Записей в блоге: 14
10.07.2024, 22:36
Цитата Сообщение от Dmit199 Посмотреть сообщение
К в примерах ни одно из них не работает, как быть?
Читать доку в которой я не смог найти события initialize или load которые ты использовал, но есть эта страница которая описывает события реально существующие в плеере

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

и другие демки тоже будет полезно для понимания другого функционала

Простой пример работы с событием canPlay которое сработает как только плеер будет готов воспроизвети видео
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
в переменной dashjs.MediaPlayer.events есть список всех поддерживаемых событий конкретной версией плеера
<div style='width: 500px'>
    <video src='' style='width: 100%' controls></video>
</div>
<script src="https://cdn.dashjs.org/v3.1.0/dash.all.min.js" rel="preload"></script>
<script>
    const player = dashjs.MediaPlayer().create();
    player.initialize(document.querySelector('video'), 'https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd', true);
    // событие сработает как только плеер загрузится и будет доступно проигрывание видео
     player.on("canPlay",()=> console.log("canPlay"))
     // так можно вывести все доступные события и посмотреть их в консоли dev tools
    console.log(dashjs.MediaPlayer.events)
</script>
</html>
1
Заблокирован
10.07.2024, 22:42  [ТС]
JavaScript
1
2
3
(ply = dashjs.MediaPlayer().create()).oninitialize = _ => console.log('sdf');
ply.onload = _ => console.log('123');
ply.initialize(v, '/test/dash.mpd', true);
Совсем никак, функции работают если вызывать через какое то время.
Скриншет подкрепил объектов переменной 'PLY'
Миниатюры
Dash плеер, как управлять качеством?  
0
Заблокирован
11.07.2024, 03:14  [ТС]
Буду разбираться с пред, ответом. Спс
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2024, 03:14
Помогаю со студенческими работами здесь

Установить в Deepin меню DASH как Xubuntu
Здравствуйте! Хочу установить Deepin, но очень нравиться меню (Dash, &quot;Пуск&quot;) в Xubuntu (XFCE). Подскажите, как можно это меню установить в...

HP Pavilion g7-2116er - как с охлаждением, с качеством сборки и т.д.?
что скажете о фирме Нр. поговаривают что с охлаждением беда у них! понравилась эта модель! http://www.alser.kz/good-543-58.html ...

Спрайты и тайлы. как покрыть экран сеткой. Boulder Dash
QBasic Друзья, нужна очень ваша помощь, ибо я ломаю голову не один год. Постараюсь описать задачу. Если совсем просто: должна...

Как с использованием libVideo скачать видео качеством лучше?
Всем привет. Есть библиотека https://githu*.***/omansak/libvideo . В ней есть пример как скачать видео с you***e. Но скачивается в самом...

Как конвертировать презентацию в avi для широкоформатного монитора с хорошим качеством?
Помогите!!!Как конвертировать презентацию в avi дляширокоформатного монитора с хорошим качеством?


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru