mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	feat(server): add transcode presets (#2084)
* feat: add transcode presets * Add migration * chore: generate api * refactor: use enum type instead of string for transcode option * chore: generate api * refactor: enhance readability of runVideoEncode method * refactor: reuse SettingSelect for transcoding presets * refactor: simplify return statement * chore: regenerate api * fix: correct label attribute * Update import * fix test --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
This commit is contained in:
		@@ -8,10 +8,11 @@ import {
 | 
			
		||||
  QueueName,
 | 
			
		||||
  StorageCore,
 | 
			
		||||
  StorageFolder,
 | 
			
		||||
  SystemConfigFFmpegDto,
 | 
			
		||||
  SystemConfigService,
 | 
			
		||||
  WithoutProperty,
 | 
			
		||||
} from '@app/domain';
 | 
			
		||||
import { AssetEntity, AssetType } from '@app/infra/db/entities';
 | 
			
		||||
import { AssetEntity, AssetType, TranscodePreset } from '@app/infra/db/entities';
 | 
			
		||||
import { Process, Processor } from '@nestjs/bull';
 | 
			
		||||
import { Inject, Logger } from '@nestjs/common';
 | 
			
		||||
import { Job } from 'bull';
 | 
			
		||||
@@ -74,10 +75,41 @@ export class VideoTranscodeProcessor {
 | 
			
		||||
  async runVideoEncode(asset: AssetEntity, savedEncodedPath: string): Promise<void> {
 | 
			
		||||
    const config = await this.systemConfigService.getConfig();
 | 
			
		||||
 | 
			
		||||
    if (config.ffmpeg.transcodeAll) {
 | 
			
		||||
    const transcode = await this.needsTranscoding(asset, config.ffmpeg);
 | 
			
		||||
    if (transcode) {
 | 
			
		||||
      //TODO: If video or audio are already the correct format, don't re-encode, copy the stream
 | 
			
		||||
      return this.runFFMPEGPipeLine(asset, savedEncodedPath);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async needsTranscoding(asset: AssetEntity, ffmpegConfig: SystemConfigFFmpegDto): Promise<boolean> {
 | 
			
		||||
    switch (ffmpegConfig.transcode) {
 | 
			
		||||
      case TranscodePreset.ALL:
 | 
			
		||||
        return true;
 | 
			
		||||
 | 
			
		||||
      case TranscodePreset.REQUIRED:
 | 
			
		||||
        {
 | 
			
		||||
          const videoStream = await this.getVideoStream(asset);
 | 
			
		||||
          if (videoStream.codec_name !== ffmpegConfig.targetVideoCodec) {
 | 
			
		||||
            return true;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case TranscodePreset.OPTIMAL: {
 | 
			
		||||
        const videoStream = await this.getVideoStream(asset);
 | 
			
		||||
        if (videoStream.codec_name !== ffmpegConfig.targetVideoCodec) {
 | 
			
		||||
          return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const videoHeightThreshold = 1080;
 | 
			
		||||
        return !videoStream.height || videoStream.height > videoHeightThreshold;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async getVideoStream(asset: AssetEntity): Promise<ffmpeg.FfprobeStream> {
 | 
			
		||||
    const videoInfo = await this.runFFProbePipeline(asset);
 | 
			
		||||
 | 
			
		||||
    const videoStreams = videoInfo.streams.filter((stream) => {
 | 
			
		||||
@@ -90,10 +122,7 @@ export class VideoTranscodeProcessor {
 | 
			
		||||
      return stream2Frames - stream1Frames;
 | 
			
		||||
    })[0];
 | 
			
		||||
 | 
			
		||||
    //TODO: If video or audio are already the correct format, don't re-encode, copy the stream
 | 
			
		||||
    if (longestVideoStream.codec_name !== config.ffmpeg.targetVideoCodec) {
 | 
			
		||||
      return this.runFFMPEGPipeLine(asset, savedEncodedPath);
 | 
			
		||||
    }
 | 
			
		||||
    return longestVideoStream;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async runFFMPEGPipeLine(asset: AssetEntity, savedEncodedPath: string): Promise<void> {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user