X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fvideo-transcoding.ts;h=37a4f3019b0ab6499bee27ba4d29c6ffeb5395ad;hb=1896bca09e088b0da9d5e845407ecebae330618c;hp=a6b79eaeaa4cddfcf5465bae56a55dc9fc6f81c7;hpb=454c20fa7cdb05eba7f1be3c83389b54807af0b3;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/video-transcoding.ts b/server/lib/video-transcoding.ts index a6b79eaea..37a4f3019 100644 --- a/server/lib/video-transcoding.ts +++ b/server/lib/video-transcoding.ts @@ -1,3 +1,4 @@ +import { Job } from 'bull' import { copyFile, ensureDir, move, remove, stat } from 'fs-extra' import { basename, extname as extnameUtil, join } from 'path' import { createTorrentAndSetInfoHash } from '@server/helpers/webtorrent' @@ -13,7 +14,7 @@ import { VideoFileModel } from '../models/video/video-file' import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist' import { updateMasterHLSPlaylist, updateSha256VODSegments } from './hls' import { generateVideoStreamingPlaylistName, getVideoFilename, getVideoFilePath } from './video-paths' -import { availableEncoders } from './video-transcoding-profiles' +import { VideoTranscodingProfilesManager } from './video-transcoding-profiles' /** * @@ -23,11 +24,10 @@ import { availableEncoders } from './video-transcoding-profiles' */ // Optimize the original video file and replace it. The resolution is not changed. -async function optimizeOriginalVideofile (video: MVideoWithFile, inputVideoFileArg?: MVideoFile) { +async function optimizeOriginalVideofile (video: MVideoWithFile, inputVideoFile: MVideoFile, job?: Job) { const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const newExtname = '.mp4' - const inputVideoFile = inputVideoFileArg || video.getMaxQualityFile() const videoInputPath = getVideoFilePath(video, inputVideoFile) const videoTranscodedPath = join(transcodeDirectory, video.id + '-transcoded' + newExtname) @@ -41,10 +41,12 @@ async function optimizeOriginalVideofile (video: MVideoWithFile, inputVideoFileA inputPath: videoInputPath, outputPath: videoTranscodedPath, - availableEncoders, - profile: 'default', + availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(), + profile: CONFIG.TRANSCODING.PROFILE, - resolution: inputVideoFile.resolution + resolution: inputVideoFile.resolution, + + job } // Could be very long! @@ -58,7 +60,7 @@ async function optimizeOriginalVideofile (video: MVideoWithFile, inputVideoFileA const videoOutputPath = getVideoFilePath(video, inputVideoFile) - await onVideoFileTranscoding(video, inputVideoFile, videoTranscodedPath, videoOutputPath) + await onWebTorrentVideoFileTranscoding(video, inputVideoFile, videoTranscodedPath, videoOutputPath) return transcodeType } catch (err) { @@ -70,7 +72,7 @@ async function optimizeOriginalVideofile (video: MVideoWithFile, inputVideoFileA } // Transcode the original video file to a lower resolution. -async function transcodeNewResolution (video: MVideoWithFile, resolution: VideoResolution, isPortrait: boolean) { +async function transcodeNewWebTorrentResolution (video: MVideoWithFile, resolution: VideoResolution, isPortrait: boolean, job: Job) { const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const extname = '.mp4' @@ -93,30 +95,34 @@ async function transcodeNewResolution (video: MVideoWithFile, resolution: VideoR inputPath: videoInputPath, outputPath: videoTranscodedPath, - availableEncoders, - profile: 'default', + availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(), + profile: CONFIG.TRANSCODING.PROFILE, + + resolution, - resolution + job } : { type: 'video' as 'video', inputPath: videoInputPath, outputPath: videoTranscodedPath, - availableEncoders, - profile: 'default', + availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(), + profile: CONFIG.TRANSCODING.PROFILE, resolution, - isPortraitMode: isPortrait + isPortraitMode: isPortrait, + + job } await transcode(transcodeOptions) - return onVideoFileTranscoding(video, newVideoFile, videoTranscodedPath, videoOutputPath) + return onWebTorrentVideoFileTranscoding(video, newVideoFile, videoTranscodedPath, videoOutputPath) } // Merge an image with an audio file to create a video -async function mergeAudioVideofile (video: MVideoWithAllFiles, resolution: VideoResolution) { +async function mergeAudioVideofile (video: MVideoWithAllFiles, resolution: VideoResolution, job: Job) { const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const newExtname = '.mp4' @@ -136,11 +142,13 @@ async function mergeAudioVideofile (video: MVideoWithAllFiles, resolution: Video inputPath: tmpPreviewPath, outputPath: videoTranscodedPath, - availableEncoders, - profile: 'default', + availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(), + profile: CONFIG.TRANSCODING.PROFILE, audioPath: audioInputPath, - resolution + resolution, + + job } try { @@ -162,11 +170,11 @@ async function mergeAudioVideofile (video: MVideoWithAllFiles, resolution: Video video.duration = await getDurationFromVideoFile(videoTranscodedPath) await video.save() - return onVideoFileTranscoding(video, inputVideoFile, videoTranscodedPath, videoOutputPath) + return onWebTorrentVideoFileTranscoding(video, inputVideoFile, videoTranscodedPath, videoOutputPath) } // Concat TS segments from a live video to a fragmented mp4 HLS playlist -async function generateHlsPlaylistFromTS (options: { +async function generateHlsPlaylistResolutionFromTS (options: { video: MVideoWithFile concatenatedTsFilePath: string resolution: VideoResolution @@ -184,12 +192,13 @@ async function generateHlsPlaylistFromTS (options: { } // Generate an HLS playlist from an input file, and update the master playlist -function generateHlsPlaylist (options: { +function generateHlsPlaylistResolution (options: { video: MVideoWithFile videoInputPath: string resolution: VideoResolution copyCodecs: boolean isPortraitMode: boolean + job?: Job }) { return generateHlsPlaylistCommon({ video: options.video, @@ -197,7 +206,8 @@ function generateHlsPlaylist (options: { copyCodecs: options.copyCodecs, isPortraitMode: options.isPortraitMode, inputPath: options.videoInputPath, - type: 'hls' as 'hls' + type: 'hls' as 'hls', + job: options.job }) } @@ -214,17 +224,22 @@ function getEnabledResolutions (type: 'vod' | 'live') { // --------------------------------------------------------------------------- export { - generateHlsPlaylist, - generateHlsPlaylistFromTS, + generateHlsPlaylistResolution, + generateHlsPlaylistResolutionFromTS, optimizeOriginalVideofile, - transcodeNewResolution, + transcodeNewWebTorrentResolution, mergeAudioVideofile, getEnabledResolutions } // --------------------------------------------------------------------------- -async function onVideoFileTranscoding (video: MVideoWithFile, videoFile: MVideoFile, transcodingPath: string, outputPath: string) { +async function onWebTorrentVideoFileTranscoding ( + video: MVideoWithFile, + videoFile: MVideoFile, + transcodingPath: string, + outputPath: string +) { const stats = await stat(transcodingPath) const fps = await getVideoFileFPS(transcodingPath) const metadata = await getMetadataFromFile(transcodingPath) @@ -251,8 +266,10 @@ async function generateHlsPlaylistCommon (options: { copyCodecs?: boolean isAAC?: boolean isPortraitMode: boolean + + job?: Job }) { - const { type, video, inputPath, resolution, copyCodecs, isPortraitMode, isAAC } = options + const { type, video, inputPath, resolution, copyCodecs, isPortraitMode, isAAC, job } = options const baseHlsDirectory = join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid) await ensureDir(join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid)) @@ -266,8 +283,8 @@ async function generateHlsPlaylistCommon (options: { inputPath, outputPath, - availableEncoders, - profile: 'default', + availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(), + profile: CONFIG.TRANSCODING.PROFILE, resolution, copyCodecs, @@ -277,7 +294,9 @@ async function generateHlsPlaylistCommon (options: { hlsPlaylist: { videoFilename - } + }, + + job } await transcode(transcodeOptions)