aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2022-09-28 10:23:03 +0200
committerChocobozzz <me@florianbigard.com>2022-09-28 10:26:28 +0200
commit1ce4256a6577d0607320a320d9c5d328bdd162f7 (patch)
treee531ab2ced0e874859794be0636d33aa04c81e6b /server/lib
parent690bad52e186a0111359062743d9638b911026f2 (diff)
downloadPeerTube-1ce4256a6577d0607320a320d9c5d328bdd162f7.tar.gz
PeerTube-1ce4256a6577d0607320a320d9c5d328bdd162f7.tar.zst
PeerTube-1ce4256a6577d0607320a320d9c5d328bdd162f7.zip
Correctly handle RTMP streams without audio
Diffstat (limited to 'server/lib')
-rw-r--r--server/lib/live/live-manager.ts29
-rw-r--r--server/lib/live/shared/muxing-session.ts7
2 files changed, 22 insertions, 14 deletions
diff --git a/server/lib/live/live-manager.ts b/server/lib/live/live-manager.ts
index aadd8e308..16715862b 100644
--- a/server/lib/live/live-manager.ts
+++ b/server/lib/live/live-manager.ts
@@ -1,4 +1,3 @@
1
2import { readdir, readFile } from 'fs-extra' 1import { readdir, readFile } from 'fs-extra'
3import { createServer, Server } from 'net' 2import { createServer, Server } from 'net'
4import { join } from 'path' 3import { join } from 'path'
@@ -9,7 +8,8 @@ import {
9 getLiveSegmentTime, 8 getLiveSegmentTime,
10 getVideoStreamBitrate, 9 getVideoStreamBitrate,
11 getVideoStreamDimensionsInfo, 10 getVideoStreamDimensionsInfo,
12 getVideoStreamFPS 11 getVideoStreamFPS,
12 hasAudioStream
13} from '@server/helpers/ffmpeg' 13} from '@server/helpers/ffmpeg'
14import { logger, loggerTagsFactory } from '@server/helpers/logger' 14import { logger, loggerTagsFactory } from '@server/helpers/logger'
15import { CONFIG, registerConfigChangedHandler } from '@server/initializers/config' 15import { CONFIG, registerConfigChangedHandler } from '@server/initializers/config'
@@ -20,7 +20,7 @@ import { VideoLiveModel } from '@server/models/video/video-live'
20import { VideoLiveSessionModel } from '@server/models/video/video-live-session' 20import { VideoLiveSessionModel } from '@server/models/video/video-live-session'
21import { VideoStreamingPlaylistModel } from '@server/models/video/video-streaming-playlist' 21import { VideoStreamingPlaylistModel } from '@server/models/video/video-streaming-playlist'
22import { MStreamingPlaylistVideo, MVideo, MVideoLiveSession, MVideoLiveVideo } from '@server/types/models' 22import { MStreamingPlaylistVideo, MVideo, MVideoLiveSession, MVideoLiveVideo } from '@server/types/models'
23import { wait } from '@shared/core-utils' 23import { pick, wait } from '@shared/core-utils'
24import { LiveVideoError, VideoState, VideoStreamingPlaylistType } from '@shared/models' 24import { LiveVideoError, VideoState, VideoStreamingPlaylistType } from '@shared/models'
25import { federateVideoIfNeeded } from '../activitypub/videos' 25import { federateVideoIfNeeded } from '../activitypub/videos'
26import { JobQueue } from '../job-queue' 26import { JobQueue } from '../job-queue'
@@ -232,10 +232,11 @@ class LiveManager {
232 const now = Date.now() 232 const now = Date.now()
233 const probe = await ffprobePromise(inputUrl) 233 const probe = await ffprobePromise(inputUrl)
234 234
235 const [ { resolution, ratio }, fps, bitrate ] = await Promise.all([ 235 const [ { resolution, ratio }, fps, bitrate, hasAudio ] = await Promise.all([
236 getVideoStreamDimensionsInfo(inputUrl, probe), 236 getVideoStreamDimensionsInfo(inputUrl, probe),
237 getVideoStreamFPS(inputUrl, probe), 237 getVideoStreamFPS(inputUrl, probe),
238 getVideoStreamBitrate(inputUrl, probe) 238 getVideoStreamBitrate(inputUrl, probe),
239 hasAudioStream(inputUrl, probe)
239 ]) 240 ])
240 241
241 logger.info( 242 logger.info(
@@ -259,26 +260,30 @@ class LiveManager {
259 return this.runMuxingSession({ 260 return this.runMuxingSession({
260 sessionId, 261 sessionId,
261 videoLive, 262 videoLive,
263
262 streamingPlaylist, 264 streamingPlaylist,
263 inputUrl, 265 inputUrl,
264 fps, 266 fps,
265 bitrate, 267 bitrate,
266 ratio, 268 ratio,
267 allResolutions 269 allResolutions,
270 hasAudio
268 }) 271 })
269 } 272 }
270 273
271 private async runMuxingSession (options: { 274 private async runMuxingSession (options: {
272 sessionId: string 275 sessionId: string
273 videoLive: MVideoLiveVideo 276 videoLive: MVideoLiveVideo
277
274 streamingPlaylist: MStreamingPlaylistVideo 278 streamingPlaylist: MStreamingPlaylistVideo
275 inputUrl: string 279 inputUrl: string
276 fps: number 280 fps: number
277 bitrate: number 281 bitrate: number
278 ratio: number 282 ratio: number
279 allResolutions: number[] 283 allResolutions: number[]
284 hasAudio: boolean
280 }) { 285 }) {
281 const { sessionId, videoLive, streamingPlaylist, allResolutions, fps, bitrate, ratio, inputUrl } = options 286 const { sessionId, videoLive } = options
282 const videoUUID = videoLive.Video.uuid 287 const videoUUID = videoLive.Video.uuid
283 const localLTags = lTags(sessionId, videoUUID) 288 const localLTags = lTags(sessionId, videoUUID)
284 289
@@ -289,15 +294,11 @@ class LiveManager {
289 294
290 const muxingSession = new MuxingSession({ 295 const muxingSession = new MuxingSession({
291 context: this.getContext(), 296 context: this.getContext(),
292 user,
293 sessionId, 297 sessionId,
294 videoLive, 298 videoLive,
295 streamingPlaylist, 299 user,
296 inputUrl, 300
297 bitrate, 301 ...pick(options, [ 'streamingPlaylist', 'inputUrl', 'bitrate', 'ratio', 'fps', 'allResolutions', 'hasAudio' ])
298 ratio,
299 fps,
300 allResolutions
301 }) 302 })
302 303
303 muxingSession.on('master-playlist-created', () => this.publishAndFederateLive(videoLive, localLTags)) 304 muxingSession.on('master-playlist-created', () => this.publishAndFederateLive(videoLive, localLTags))
diff --git a/server/lib/live/shared/muxing-session.ts b/server/lib/live/shared/muxing-session.ts
index 310a7026d..505717dce 100644
--- a/server/lib/live/shared/muxing-session.ts
+++ b/server/lib/live/shared/muxing-session.ts
@@ -59,6 +59,8 @@ class MuxingSession extends EventEmitter {
59 private readonly bitrate: number 59 private readonly bitrate: number
60 private readonly ratio: number 60 private readonly ratio: number
61 61
62 private readonly hasAudio: boolean
63
62 private readonly videoId: number 64 private readonly videoId: number
63 private readonly videoUUID: string 65 private readonly videoUUID: string
64 private readonly saveReplay: boolean 66 private readonly saveReplay: boolean
@@ -94,6 +96,7 @@ class MuxingSession extends EventEmitter {
94 bitrate: number 96 bitrate: number
95 ratio: number 97 ratio: number
96 allResolutions: number[] 98 allResolutions: number[]
99 hasAudio: boolean
97 }) { 100 }) {
98 super() 101 super()
99 102
@@ -108,6 +111,8 @@ class MuxingSession extends EventEmitter {
108 this.bitrate = options.bitrate 111 this.bitrate = options.bitrate
109 this.ratio = options.ratio 112 this.ratio = options.ratio
110 113
114 this.hasAudio = options.hasAudio
115
111 this.allResolutions = options.allResolutions 116 this.allResolutions = options.allResolutions
112 117
113 this.videoId = this.videoLive.Video.id 118 this.videoId = this.videoLive.Video.id
@@ -140,6 +145,8 @@ class MuxingSession extends EventEmitter {
140 bitrate: this.bitrate, 145 bitrate: this.bitrate,
141 ratio: this.ratio, 146 ratio: this.ratio,
142 147
148 hasAudio: this.hasAudio,
149
143 availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(), 150 availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(),
144 profile: CONFIG.LIVE.TRANSCODING.PROFILE 151 profile: CONFIG.LIVE.TRANSCODING.PROFILE
145 }) 152 })