mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-10-05 10:49:28 +02:00
Separate HLS audio and video streams
Allows: * The HLS player to propose an "Audio only" resolution * The live to output an "Audio only" resolution * The live to ingest and output an "Audio only" stream This feature is under a config for VOD videos and is enabled by default for lives In the future we can imagine: * To propose multiple audio streams for a specific video * To ingest an audio only VOD and just output an audio only "video" (the player would play the audio file and PeerTube would not generate additional resolutions) This commit introduce a new way to download videos: * Add "/download/videos/generate/:videoId" endpoint where PeerTube can mux an audio only and a video only file to a mp4 container * The download client modal introduces a new default panel where the user can choose resolutions it wants to download
This commit is contained in:
parent
e77ba2dfbc
commit
816f346a60
186 changed files with 5748 additions and 2807 deletions
|
@ -14,15 +14,19 @@ import {
|
|||
import { buildUUID } from '@peertube/peertube-node-utils'
|
||||
import { logger } from '@server/helpers/logger.js'
|
||||
import { onVideoStudioEnded, safeCleanupStudioTMPFiles } from '@server/lib/video-studio.js'
|
||||
import { MVideo } from '@server/types/models/index.js'
|
||||
import { MVideoWithFile } from '@server/types/models/index.js'
|
||||
import { MRunnerJob } from '@server/types/models/runners/index.js'
|
||||
import { basename } from 'path'
|
||||
import { generateRunnerEditionTranscodingVideoInputFileUrl, generateRunnerTranscodingVideoInputFileUrl } from '../runner-urls.js'
|
||||
import {
|
||||
generateRunnerEditionTranscodingVideoInputFileUrl,
|
||||
generateRunnerTranscodingAudioInputFileUrl,
|
||||
generateRunnerTranscodingVideoInputFileUrl
|
||||
} from '../runner-urls.js'
|
||||
import { AbstractJobHandler } from './abstract-job-handler.js'
|
||||
import { loadRunnerVideo } from './shared/utils.js'
|
||||
|
||||
type CreateOptions = {
|
||||
video: MVideo
|
||||
video: MVideoWithFile
|
||||
tasks: VideoStudioTaskPayload[]
|
||||
priority: number
|
||||
}
|
||||
|
@ -34,9 +38,15 @@ export class VideoStudioTranscodingJobHandler extends AbstractJobHandler<CreateO
|
|||
const { video, priority, tasks } = options
|
||||
|
||||
const jobUUID = buildUUID()
|
||||
const { separatedAudioFile } = video.getMaxQualityAudioAndVideoFiles()
|
||||
|
||||
const payload: RunnerJobStudioTranscodingPayload = {
|
||||
input: {
|
||||
videoFileUrl: generateRunnerTranscodingVideoInputFileUrl(jobUUID, video.uuid)
|
||||
videoFileUrl: generateRunnerTranscodingVideoInputFileUrl(jobUUID, video.uuid),
|
||||
|
||||
separatedAudioFileUrl: separatedAudioFile
|
||||
? [ generateRunnerTranscodingAudioInputFileUrl(jobUUID, video.uuid) ]
|
||||
: []
|
||||
},
|
||||
tasks: tasks.map(t => {
|
||||
if (isVideoStudioTaskIntro(t) || isVideoStudioTaskOutro(t)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue