[ home / recent / all ] [ b / dis / pol ] [ a / c / e / lgbt / mu / p / v ] [ rss / tor / i2p / status / meta / about ]

/p/ - Programming

1001 11010001 10000111
Name
Email
Subject
Comment
File
Embed
Password (For file deletion.)
[Return] [Go to bottom] [Catalog]


File: Screenshot_2026_06_28-3.png (111.56 KB, 383x727) ImgOps

Screenshot_2026_06_28-3.png (111.56 KB, 383x727)

 No.1504

Для кращого стрімінгу відео в I2P (тобто відтворення файлу, який вже був завантажений на сайт, без завантаження користувачем) мені допомогло наступне: Високоякісне стиснення; Зменшення кількості тунелів до 2 (двох) без резервних тунелів; Можливо, велика кількість транзитного трафіку на маршрутизаторі також допомагає.
Щоб відновити відтворення під час буферизації, мені потенційно допомогли такі методи: очікування; увімкнення та вимкнення паузи та повноекранного режиму; перемотування відео назад. Сервіс стиснення https://hdconvert.com/en/compress_video_online.html .
Як запропонував ChatGPT (тобто це не я придумав код), щоб не було повного відвалу відтворення, можна використовувати такий код. Однак відновлення може бути тривалим
<script> function attachRetry(video) { let retryCount = 0; const MAX_RETRIES = 5; let started = false; function tryPlay() { video.play().catch(() => {}); } function recover() { if (retryCount >= MAX_RETRIES) return; retryCount++; const time = video.currentTime; // НЕ використовуємо load() одразу // тільки пробуємо відновити відтворення setTimeout(() => { if (video.readyState >= 2) { video.currentTime = time; tryPlay(); } }, 500); } // фіксуємо момент, коли відео реально почало життя video.addEventListener("timeupdate", () => { if (!started && video.currentTime >= 0.1) { started = true; } }); // НЕ реагуємо на buffering до 6 секунд video.addEventListener("waiting", () => { if (!started) return; if (video.currentTime < 6) return; // тільки легка перевірка, без reload setTimeout(() => { if (video.readyState < 2) { recover(); } }, 2000); }); // реальна помилка → відновлення video.addEventListener("error", () => { if (video.currentTime < 6) return; recover(); }); video.addEventListener("stalled", () => { if (video.currentTime < 6) return; recover(); }); } attachRetry(document.getElementById("video1")); attachRetry(document.getElementById("video2")); </script>
http://7knrms2wnpgr2pwp4nkctfvy5vzmudqaihdm2qjrxvxstczowr5q.b32.i2p/cat-video-7655.html
Не знаю, що буде при спробі одночасного відтворення відео не одним користувачем

 No.1505

>>1504
Доповнення. Також може допомогти вимкнення зайвих функцій і сервісів (наприклад, gitssh.idk.i2p, Irc2P)

 No.1506

>>1504
Практичні поради щодо обрання якості.
240p* (1280x720; 6,98 МБ, 05 хв 19 с, без звуку) - відтворення якісне, проте скоріше не рекомендовано через занадто погану якість
360р (1280x720; 71,9 МБ; 35 хв 00 с, без звуку) - рекомендовано з використанням скрипта вище**
480р (300x450; 5,88 МБ; 04 хв 24 с, без звуку), (406x720; 5,63 МБ; 01 хв 46 с, зі звуком) - рекомендовано, скрипт вище не обов'язковий***
576р (540x960; 69,6 МБ; 06 хв 37 с, без звуку, слабко досліджено) - скоріше не рекомендовано
720p (720x1280; 1,93 ГБ; 02 год 04 хв 14 с, без звуку), (720x1280; 28,9 МБ; 01 хв 46 с, зі звуком) - не рекомендовано

* - тут і далі мається на увазі фактична якість відео
** - скрипт потрібен, якщо відео довге! факт якості 360р не робить потрібним використання скрипта
*** - тобто для вказаних коротких відео він не обов'язковий

Щодо скрипта. Без нього відео може відвалитись на досить різних тривалостях: за нормальних умов від 6+ хв до 20+ хв. Тому загалом рекомендую використовувати його, якщо тривалість відео перевищує 6 хв. Також пам'ятайте, що цей скрипт - це не обов'язково швидке і непомітне виправлення відвалу.

 No.1507

>>1504
Новий скрипт.
<script> function attachRetry(video) { let retryCount = 0; const MAX_RETRIES = 5; let started = false; let recovering = false; let seeking = false; let lastTime = 0; let lastProgress = performance.now(); function tryPlay() { video.play().catch(() => {}); } function resetWatchdog() { lastTime = video.currentTime; lastProgress = performance.now(); } function recover() { if (recovering) return; if (retryCount >= MAX_RETRIES) return; if (video.paused || video.ended || seeking) return; recovering = true; retryCount++; // Запам'ятовуємо саме поточну позицію. // Ніякого load() і ніякого перемотування. const time = video.currentTime; try { video.currentTime = time; } catch (_) {} tryPlay(); // Даємо браузеру короткий час відновити відтворення. setTimeout(() => { if (video.currentTime > time + 0.05) { recovering = false; retryCount = 0; resetWatchdog(); return; } recovering = false; resetWatchdog(); }, 500); } // Відео реально почало рухатися. video.addEventListener("timeupdate", () => { if (video.currentTime >= 0.1) { started = true; } if (!seeking && video.currentTime > lastTime + 0.05) { lastTime = video.currentTime; lastProgress = performance.now(); if (!recovering) { retryCount = 0; } } }); // Користувач почав перемотування. video.addEventListener("seeking", () => { seeking = true; resetWatchdog(); }); // Перемотування завершилося. video.addEventListener("seeked", () => { seeking = false; retryCount = 0; recovering = false; resetWatchdog(); if (!video.paused && !video.ended) { tryPlay(); } }); // Основний watchdog. // Ловить зависання, навіть якщо браузер не показує waiting. const watchdog = setInterval(() => { if (!started) return; if (video.paused || video.ended) return; if (seeking || recovering) return; if (video.currentTime < 6) return; const now = performance.now(); if (now - lastProgress >= 1500) { recover(); resetWatchdog(); } }, 500); // Звичайний сигнал буферизації. video.addEventListener("waiting", () => { if (!started || seeking) return; if (video.currentTime < 6) return; setTimeout(() => { if ( !video.paused && !video.ended && !seeking && video.readyState < 3 ) { recover(); } }, 500); }); // Потік перестав надходити. video.addEventListener("stalled", () => { if (!started || seeking) return; if (video.currentTime < 6) return; recover(); }); // Помилка відео. video.addEventListener("error", () => { if (!started || seeking) return; if (video.currentTime < 6) return; recover(); }); // Відтворення відновилося. video.addEventListener("playing", () => { recovering = false; retryCount = 0; resetWatchdog(); }); // Якщо користувач поставив відео на паузу, // watchdog не повинен нічого робити. video.addEventListener("pause", () => { resetWatchdog(); }); } attachRetry(document.getElementById("video1")); attachRetry(document.getElementById("video2")); </script>
З практики. При спробі відвалу (він тут характеризується припиненням відтворення відео без позначки буферизації) воно показує буферизацію, яка може тривати кілька десятків секунд.

 No.1508

нахуя сраний жаваскрипт, якщо в html5 є елемент <video>, котрий прозоро йде крізь ш2з? бобо?



[Return] [Catalog] [Post a Reply]
Delete Post [ ]
[ home / recent / all ] [ b / dis / pol ] [ a / c / e / lgbt / mu / p / v ] [ rss / tor / i2p / status / meta / about ]