Fix HLS buffer

pull/4813/head
Chocobozzz 2022-02-22 13:44:12 +01:00
parent 89e3de8dc6
commit ac5f679ad6
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
2 changed files with 44 additions and 21 deletions

View File

@ -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)
}

View File

@ -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<HybridLoaderSettings> {
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,