From 3e254de8bef59e4e25b74d1b0fde07de29654ada Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 3 Aug 2021 11:51:49 +0200 Subject: HLS v1 support --- .../src/assets/player/peertube-player-manager.ts | 45 +++++++++++++++++----- 1 file changed, 36 insertions(+), 9 deletions(-) (limited to 'client/src/assets/player/peertube-player-manager.ts') diff --git a/client/src/assets/player/peertube-player-manager.ts b/client/src/assets/player/peertube-player-manager.ts index 766ad203e..c45e8f53e 100644 --- a/client/src/assets/player/peertube-player-manager.ts +++ b/client/src/assets/player/peertube-player-manager.ts @@ -22,6 +22,7 @@ import './videojs-components/settings-panel-child' import './videojs-components/theater-button' import './playlist/playlist-plugin' import videojs from 'video.js' +import { HlsJsEngineSettings } from '@peertube/p2p-media-loader-hlsjs' import { PluginsManager } from '@root-helpers/plugins-manager' import { buildVideoLink, decorateVideoLink } from '@shared/core-utils' import { isDefaultLocale } from '@shared/core-utils/i18n' @@ -30,11 +31,12 @@ import { copyToClipboard } from '../../root-helpers/utils' import { RedundancyUrlManager } from './p2p-media-loader/redundancy-url-manager' import { segmentUrlBuilderFactory } from './p2p-media-loader/segment-url-builder' import { segmentValidatorFactory } from './p2p-media-loader/segment-validator' -import { getStoredP2PEnabled } from './peertube-player-local-storage' +import { getAverageBandwidthInStore, getStoredP2PEnabled, saveAverageBandwidth } from './peertube-player-local-storage' import { NextPreviousVideoButtonOptions, P2PMediaLoaderPluginOptions, PeerTubeLinkButtonOptions, + PlayerNetworkInfo, PlaylistPluginOptions, UserWatching, VideoJSCaption, @@ -148,7 +150,7 @@ export class PeertubePlayerManager { if (mode === 'webtorrent') await import('./webtorrent/webtorrent-plugin') if (mode === 'p2p-media-loader') { [ p2pMediaLoader ] = await Promise.all([ - import('p2p-media-loader-hlsjs'), + import('@peertube/p2p-media-loader-hlsjs'), import('./p2p-media-loader/p2p-media-loader-plugin') ]) } @@ -193,6 +195,12 @@ export class PeertubePlayerManager { mode }) + player.on('p2pInfo', (_, data: PlayerNetworkInfo) => { + if (data.source !== 'p2p-media-loader' || isNaN(data.bandwidthEstimate)) return + + saveAverageBandwidth(data.bandwidthEstimate) + }) + return res(player) }) }) @@ -359,12 +367,13 @@ export class PeertubePlayerManager { consumeOnly = true } - const p2pMediaLoaderConfig = { + const p2pMediaLoaderConfig: HlsJsEngineSettings = { loader: { trackerAnnounce, segmentValidator: segmentValidatorFactory(options.p2pMediaLoader.segmentsSha256Url, options.common.isLive), rtcConfig: getRtcConfig(), requiredSegmentsPriority: 1, + simultaneousHttpDownloads: 1, segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager), useP2P: getStoredP2PEnabled(), consumeOnly @@ -373,6 +382,7 @@ export class PeertubePlayerManager { swarmId: p2pMediaLoaderOptions.playlistUrl } } + const hlsjs = { levelLabelHandler: (level: { height: number, width: number }) => { const resolution = Math.min(level.height || 0, level.width || 0) @@ -387,12 +397,7 @@ export class PeertubePlayerManager { return label }, html5: { - hlsjsConfig: { - capLevelToPlayerSize: true, - autoStartLoad: false, - liveSyncDurationCount: 5, - loader: new p2pMediaLoaderModule.Engine(p2pMediaLoaderConfig).createLoaderClass() - } + hlsjsConfig: this.getHLSOptions(p2pMediaLoaderModule, p2pMediaLoaderConfig) } } @@ -402,6 +407,28 @@ export class PeertubePlayerManager { return toAssign } + private static getHLSOptions (p2pMediaLoaderModule: any, p2pMediaLoaderConfig: HlsJsEngineSettings) { + const base = { + capLevelToPlayerSize: true, + autoStartLoad: false, + liveSyncDurationCount: 5, + + loader: new p2pMediaLoaderModule.Engine(p2pMediaLoaderConfig).createLoaderClass() + } + + const averageBandwidth = getAverageBandwidthInStore() + if (!averageBandwidth) return base + + return { + ...base, + + abrEwmaDefaultEstimate: averageBandwidth * 8, // We want bit/s + startLevel: -1, + testBandwidth: false, + debug: false + } + } + private static addWebTorrentOptions (plugins: VideoJSPluginOptions, options: PeertubePlayerManagerOptions) { const commonOptions = options.common const webtorrentOptions = options.webtorrent -- cgit v1.2.3