Add hls support on server
This commit is contained in:
parent
4348a27d25
commit
0920929696
81 changed files with 2000 additions and 407 deletions
|
@ -1,11 +1,14 @@
|
|||
import { CONFIG } from '../initializers'
|
||||
import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers'
|
||||
import { extname, join } from 'path'
|
||||
import { getVideoFileFPS, getVideoFileResolution, transcode } from '../helpers/ffmpeg-utils'
|
||||
import { copy, remove, move, stat } from 'fs-extra'
|
||||
import { copy, ensureDir, move, remove, stat } from 'fs-extra'
|
||||
import { logger } from '../helpers/logger'
|
||||
import { VideoResolution } from '../../shared/models/videos'
|
||||
import { VideoFileModel } from '../models/video/video-file'
|
||||
import { VideoModel } from '../models/video/video'
|
||||
import { updateMasterHLSPlaylist, updateSha256Segments } from './hls'
|
||||
import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
|
||||
import { VideoStreamingPlaylistType } from '../../shared/models/videos/video-streaming-playlist.type'
|
||||
|
||||
async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFileModel) {
|
||||
const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
|
||||
|
@ -17,7 +20,8 @@ async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFi
|
|||
|
||||
const transcodeOptions = {
|
||||
inputPath: videoInputPath,
|
||||
outputPath: videoTranscodedPath
|
||||
outputPath: videoTranscodedPath,
|
||||
resolution: inputVideoFile.resolution
|
||||
}
|
||||
|
||||
// Could be very long!
|
||||
|
@ -47,7 +51,7 @@ async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFi
|
|||
}
|
||||
}
|
||||
|
||||
async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) {
|
||||
async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortrait: boolean) {
|
||||
const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
|
||||
const extname = '.mp4'
|
||||
|
||||
|
@ -60,13 +64,13 @@ async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoR
|
|||
size: 0,
|
||||
videoId: video.id
|
||||
})
|
||||
const videoOutputPath = join(videosDirectory, video.getVideoFilename(newVideoFile))
|
||||
const videoOutputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(newVideoFile))
|
||||
|
||||
const transcodeOptions = {
|
||||
inputPath: videoInputPath,
|
||||
outputPath: videoOutputPath,
|
||||
resolution,
|
||||
isPortraitMode
|
||||
isPortraitMode: isPortrait
|
||||
}
|
||||
|
||||
await transcode(transcodeOptions)
|
||||
|
@ -84,6 +88,38 @@ async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoR
|
|||
video.VideoFiles.push(newVideoFile)
|
||||
}
|
||||
|
||||
async function generateHlsPlaylist (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) {
|
||||
const baseHlsDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
|
||||
await ensureDir(join(HLS_PLAYLIST_DIRECTORY, video.uuid))
|
||||
|
||||
const videoInputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(video.getOriginalFile()))
|
||||
const outputPath = join(baseHlsDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
|
||||
|
||||
const transcodeOptions = {
|
||||
inputPath: videoInputPath,
|
||||
outputPath,
|
||||
resolution,
|
||||
isPortraitMode,
|
||||
generateHlsPlaylist: true
|
||||
}
|
||||
|
||||
await transcode(transcodeOptions)
|
||||
|
||||
await updateMasterHLSPlaylist(video)
|
||||
await updateSha256Segments(video)
|
||||
|
||||
const playlistUrl = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
|
||||
|
||||
await VideoStreamingPlaylistModel.upsert({
|
||||
videoId: video.id,
|
||||
playlistUrl,
|
||||
segmentsSha256Url: CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsSha256SegmentsStaticPath(video.uuid),
|
||||
p2pMediaLoaderInfohashes: VideoStreamingPlaylistModel.buildP2PMediaLoaderInfoHashes(playlistUrl, video.VideoFiles),
|
||||
|
||||
type: VideoStreamingPlaylistType.HLS
|
||||
})
|
||||
}
|
||||
|
||||
async function importVideoFile (video: VideoModel, inputFilePath: string) {
|
||||
const { videoFileResolution } = await getVideoFileResolution(inputFilePath)
|
||||
const { size } = await stat(inputFilePath)
|
||||
|
@ -125,6 +161,7 @@ async function importVideoFile (video: VideoModel, inputFilePath: string) {
|
|||
}
|
||||
|
||||
export {
|
||||
generateHlsPlaylist,
|
||||
optimizeVideofile,
|
||||
transcodeOriginalVideofile,
|
||||
importVideoFile
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue