From c826f34a45757b324a20f71665b44ed10e6953b5 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 6 Aug 2021 10:39:40 +0200 Subject: Limit live bitrate --- server/lib/live/live-manager.ts | 28 +++++++++++++++++++++++----- server/lib/live/shared/muxing-session.ts | 5 +++++ 2 files changed, 28 insertions(+), 5 deletions(-) (limited to 'server/lib/live') diff --git a/server/lib/live/live-manager.ts b/server/lib/live/live-manager.ts index f106d69fb..b19ecef6f 100644 --- a/server/lib/live/live-manager.ts +++ b/server/lib/live/live-manager.ts @@ -1,7 +1,13 @@ import { createServer, Server } from 'net' import { isTestInstance } from '@server/helpers/core-utils' -import { computeResolutionsToTranscode, getVideoFileFPS, getVideoFileResolution } from '@server/helpers/ffprobe-utils' +import { + computeResolutionsToTranscode, + ffprobePromise, + getVideoFileBitrate, + getVideoFileFPS, + getVideoFileResolution +} from '@server/helpers/ffprobe-utils' import { logger, loggerTagsFactory } from '@server/helpers/logger' import { CONFIG, registerConfigChangedHandler } from '@server/initializers/config' import { P2P_MEDIA_LOADER_PEER_VERSION, VIDEO_LIVE, VIEW_LIFETIME } from '@server/initializers/constants' @@ -193,11 +199,20 @@ class LiveManager { const rtmpUrl = 'rtmp://127.0.0.1:' + config.rtmp.port + streamPath - const [ { videoFileResolution }, fps ] = await Promise.all([ - getVideoFileResolution(rtmpUrl), - getVideoFileFPS(rtmpUrl) + const now = Date.now() + const probe = await ffprobePromise(rtmpUrl) + + const [ { videoFileResolution }, fps, bitrate ] = await Promise.all([ + getVideoFileResolution(rtmpUrl, probe), + getVideoFileFPS(rtmpUrl, probe), + getVideoFileBitrate(rtmpUrl, probe) ]) + logger.info( + '%s probing took %d ms (bitrate: %d, fps: %d, resolution: %d)', + rtmpUrl, Date.now() - now, bitrate, fps, videoFileResolution, lTags(sessionId, video.uuid) + ) + const allResolutions = this.buildAllResolutionsToTranscode(videoFileResolution) logger.info( @@ -213,6 +228,7 @@ class LiveManager { streamingPlaylist, rtmpUrl, fps, + bitrate, allResolutions }) } @@ -223,9 +239,10 @@ class LiveManager { streamingPlaylist: MStreamingPlaylistVideo rtmpUrl: string fps: number + bitrate: number allResolutions: number[] }) { - const { sessionId, videoLive, streamingPlaylist, allResolutions, fps, rtmpUrl } = options + const { sessionId, videoLive, streamingPlaylist, allResolutions, fps, bitrate, rtmpUrl } = options const videoUUID = videoLive.Video.uuid const localLTags = lTags(sessionId, videoUUID) @@ -239,6 +256,7 @@ class LiveManager { videoLive, streamingPlaylist, rtmpUrl, + bitrate, fps, allResolutions }) diff --git a/server/lib/live/shared/muxing-session.ts b/server/lib/live/shared/muxing-session.ts index 709d6c615..62708b14b 100644 --- a/server/lib/live/shared/muxing-session.ts +++ b/server/lib/live/shared/muxing-session.ts @@ -54,6 +54,7 @@ class MuxingSession extends EventEmitter { private readonly streamingPlaylist: MStreamingPlaylistVideo private readonly rtmpUrl: string private readonly fps: number + private readonly bitrate: number private readonly allResolutions: number[] private readonly videoId: number @@ -83,6 +84,7 @@ class MuxingSession extends EventEmitter { streamingPlaylist: MStreamingPlaylistVideo rtmpUrl: string fps: number + bitrate: number allResolutions: number[] }) { super() @@ -94,6 +96,7 @@ class MuxingSession extends EventEmitter { this.streamingPlaylist = options.streamingPlaylist this.rtmpUrl = options.rtmpUrl this.fps = options.fps + this.bitrate = options.bitrate this.allResolutions = options.allResolutions this.videoId = this.videoLive.Video.id @@ -118,6 +121,8 @@ class MuxingSession extends EventEmitter { resolutions: this.allResolutions, fps: this.fps, + bitrate: this.bitrate, + availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(), profile: CONFIG.LIVE.TRANSCODING.PROFILE }) -- cgit v1.2.3