import { Notifier } from '../../notifier'
import { generateHlsPlaylist, mergeAudioVideofile, optimizeOriginalVideofile, transcodeNewResolution } from '../../video-transcoding'
import { JobQueue } from '../job-queue'
+import { TranscodeOptionsType } from '@server/helpers/ffmpeg-utils'
async function processVideoTranscoding (job: Bull.Job) {
const payload = job.data as VideoTranscodingPayload
await retryTransactionWrapper(publishNewResolutionIfNeeded, video, payload)
} else {
- await optimizeOriginalVideofile(video)
+ const transcodeType = await optimizeOriginalVideofile(video)
- await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload)
+ await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload, transcodeType)
}
return video
async function publishNewResolutionIfNeeded (video: MVideoUUID, payload?: NewResolutionTranscodingPayload | MergeAudioTranscodingPayload) {
await publishAndFederateIfNeeded(video)
- await createHlsJobIfEnabled(payload)
+ createHlsJobIfEnabled(Object.assign({}, payload, { copyCodecs: true })
}
-async function onVideoFileOptimizerSuccess (videoArg: MVideoWithFile, payload: OptimizeTranscodingPayload) {
+async function onVideoFileOptimizerSuccess (
+ videoArg: MVideoWithFile,
+ payload: OptimizeTranscodingPayload,
+ transcodeType: TranscodeOptionsType
+) {
if (videoArg === undefined) return undefined
// Outside the transaction (IO on disk)
let videoPublished = false
// Generate HLS version of the max quality file
- const hlsPayload = Object.assign({}, payload, { resolution: videoDatabase.getMaxQualityFile().resolution })
- await createHlsJobIfEnabled(hlsPayload)
+ const originalFileHLSPayload = Object.assign({}, payload, {
+ isPortraitMode,
+ resolution: videoDatabase.getMaxQualityFile().resolution,
+ // If we quick transcoded original file, force transcoding for HLS to avoid some weird playback issues
+ copyCodecs: transcodeType !== 'quick-transcode'
+ })
+ createHlsJobIfEnabled(originalFileHLSPayload)
if (resolutionsEnabled.length !== 0) {
for (const resolution of resolutionsEnabled) {
// ---------------------------------------------------------------------------
-function createHlsJobIfEnabled (payload?: { videoUUID: string, resolution: number, isPortraitMode?: boolean }) {
+function createHlsJobIfEnabled (payload: { videoUUID: string, resolution: number, isPortraitMode?: boolean, copyCodecs: boolean }) {
// Generate HLS playlist?
if (payload && CONFIG.TRANSCODING.HLS.ENABLED) {
const hlsTranscodingPayload = {
videoUUID: payload.videoUUID,
resolution: payload.resolution,
isPortraitMode: payload.isPortraitMode,
- copyCodecs: true
+ copyCodecs: payload.copyCodecs
}
return JobQueue.Instance.createJob({ type: 'video-transcoding', payload: hlsTranscodingPayload })