From ac5f679ad60fc48db6d9a9534a8ac5fd20eda36f Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 22 Feb 2022 13:44:12 +0100 Subject: Fix HLS buffer --- .../player/p2p-media-loader/segment-url-builder.ts | 4 +- .../player/peertube-player-options-builder.ts | 61 +++++++++++++++------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/client/src/assets/player/p2p-media-loader/segment-url-builder.ts b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts index 5ddc81ff6..9d324078a 100644 --- a/client/src/assets/player/p2p-media-loader/segment-url-builder.ts +++ b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts @@ -1,10 +1,10 @@ import { Segment } from '@peertube/p2p-media-loader-core' import { RedundancyUrlManager } from './redundancy-url-manager' -function segmentUrlBuilderFactory (redundancyUrlManager: RedundancyUrlManager, requiredSegmentsPriority: number) { +function segmentUrlBuilderFactory (redundancyUrlManager: RedundancyUrlManager, useOriginPriority: number) { return function segmentBuilder (segment: Segment) { // Don't use redundancy for high priority segments - if (segment.priority <= requiredSegmentsPriority) return segment.url + if (segment.priority <= useOriginPriority) return segment.url return redundancyUrlManager.buildUrl(segment.url) } diff --git a/client/src/assets/player/peertube-player-options-builder.ts b/client/src/assets/player/peertube-player-options-builder.ts index 901f6cd3b..71be5ccff 100644 --- a/client/src/assets/player/peertube-player-options-builder.ts +++ b/client/src/assets/player/peertube-player-options-builder.ts @@ -19,6 +19,7 @@ import { VideoJSPluginOptions } from './peertube-videojs-typings' import { buildVideoOrPlaylistEmbed, getRtcConfig, isIOS, isSafari } from './utils' +import { HybridLoaderSettings } from '@peertube/p2p-media-loader-core' export type PlayerMode = 'webtorrent' | 'p2p-media-loader' @@ -198,9 +199,6 @@ export class PeertubePlayerOptionsBuilder { const p2pMediaLoaderOptions = this.options.p2pMediaLoader const commonOptions = this.options.common - const trackerAnnounce = p2pMediaLoaderOptions.trackerAnnounce - .filter(t => t.startsWith('ws')) - const redundancyUrlManager = new RedundancyUrlManager(this.options.p2pMediaLoader.redundancyBaseUrls) const p2pMediaLoader: P2PMediaLoaderPluginOptions = { @@ -210,23 +208,8 @@ export class PeertubePlayerOptionsBuilder { src: p2pMediaLoaderOptions.playlistUrl } - let consumeOnly = false - if ((navigator as any)?.connection?.type === 'cellular') { - console.log('We are on a cellular connection: disabling seeding.') - consumeOnly = true - } - const p2pMediaLoaderConfig: HlsJsEngineSettings = { - loader: { - trackerAnnounce, - segmentValidator: segmentValidatorFactory(this.options.p2pMediaLoader.segmentsSha256Url, this.options.common.isLive), - rtcConfig: getRtcConfig(), - requiredSegmentsPriority: 1, - simultaneousHttpDownloads: 1, - segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager, 1), - useP2P: commonOptions.p2pEnabled, - consumeOnly - }, + loader: this.getP2PMediaLoaderOptions(redundancyUrlManager), segments: { swarmId: p2pMediaLoaderOptions.playlistUrl } @@ -256,6 +239,46 @@ export class PeertubePlayerOptionsBuilder { return toAssign } + private getP2PMediaLoaderOptions (redundancyUrlManager: RedundancyUrlManager): Partial { + let consumeOnly = false + if ((navigator as any)?.connection?.type === 'cellular') { + console.log('We are on a cellular connection: disabling seeding.') + consumeOnly = true + } + + const trackerAnnounce = this.options.p2pMediaLoader.trackerAnnounce + .filter(t => t.startsWith('ws')) + + const specificLiveOrVODOptions = this.options.common.isLive + ? { // Live + requiredSegmentsPriority: 1 + } + : { // VOD + requiredSegmentsPriority: 3, + + cachedSegmentExpiration: 86400000, + cachedSegmentsCount: 100, + + httpDownloadMaxPriority: 9, + httpDownloadProbability: 0.06, + httpDownloadProbabilitySkipIfNoPeers: true, + + p2pDownloadMaxPriority: 50 + } + + return { + trackerAnnounce, + segmentValidator: segmentValidatorFactory(this.options.p2pMediaLoader.segmentsSha256Url, this.options.common.isLive), + rtcConfig: getRtcConfig(), + simultaneousHttpDownloads: 1, + segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager, 1), + useP2P: this.options.common.p2pEnabled, + consumeOnly, + + ...specificLiveOrVODOptions + } + } + private getHLSOptions (p2pMediaLoaderConfig: HlsJsEngineSettings) { const base = { capLevelToPlayerSize: true, -- cgit v1.2.3