public static Guid ComputeVideo(string originFilePath, string videoEncodingFormats, bool?sprite) { FileContainer fileContainer = FileContainer.NewVideoContainer(originFilePath); FileItem sourceFile = fileContainer.SourceFileItem; // Récupérer la durée totale de la vidéo et sa résolution, autorisation encoding bool successGetSourceInfo = VideoSourceManager.SuccessAnalyseSource(sourceFile, sourceFile.InfoSourceProcess); if (successGetSourceInfo && !sourceFile.HasReachMaxVideoDurationForEncoding()) { VideoSize[] requestFormats = GetVideoSizes(videoEncodingFormats); VideoSize[] authorizedFormats = GetVideoSizes(VideoSettings.Instance.AuthorizedQuality); IList <VideoSize> formats = requestFormats.Intersect(authorizedFormats).ToList(); // suppression des formats à encoder avec une qualité/bitrate/nbframe/resolution... supérieure foreach (VideoSize videoSize in formats.ToList()) { switch (videoSize) { case VideoSize.F240p: if (sourceFile.VideoHeight <= 240) { formats.Remove(videoSize); } break; case VideoSize.F360p: if (sourceFile.VideoHeight <= 360) { formats.Remove(videoSize); } break; case VideoSize.F480p: if (sourceFile.VideoHeight <= 480) { formats.Remove(videoSize); } break; case VideoSize.F720p: if (sourceFile.VideoHeight <= 720) { formats.Remove(videoSize); } break; case VideoSize.F1080p: if (sourceFile.VideoHeight <= 1080) { formats.Remove(videoSize); } break; } } if (formats.Any()) { fileContainer.AddEncodedVideo(formats); } // si ipfs add source demandé mais pas d'encoding à faire... if (IpfsSettings.Instance.AddVideoSource || !fileContainer.EncodedFileItems.Any()) { sourceFile.AddIpfsProcess(sourceFile.SourceFilePath); IpfsDaemon.Instance.Queue(sourceFile); } // si sprite demandé if (sprite ?? false) { fileContainer.AddSprite(); // si pas d'encoding à faire... déclencher le sprite maintenant avec la source if (!fileContainer.EncodedFileItems.Any()) { SpriteDaemon.Instance.Queue(fileContainer.SpriteVideoFileItem, "Waiting sprite creation..."); } } } if (fileContainer.EncodedFileItems.Any()) { if (VideoSettings.Instance.GpuEncodeMode) { // encoding audio de la source puis ça sera encoding videos Gpu AudioCpuEncodeDaemon.Instance.Queue(sourceFile, "waiting audio encoding..."); } else { // si encoding est demandé, et gpuMode -> encodingAudio foreach (FileItem file in fileContainer.EncodedFileItems) { AudioVideoCpuEncodeDaemon.Instance.Queue(file, "Waiting encode..."); } } } return(fileContainer.ProgressToken); }
public static Guid ComputeVideo(string originFilePath, string videoEncodingFormats, bool?sprite) { FileContainer fileContainer = FileContainer.NewVideoContainer(originFilePath); FileItem sourceFile = fileContainer.SourceFileItem; // Récupérer la durée totale de la vidéo et sa résolution, autorisation encoding bool successGetSourceInfo = VideoSourceManager.SuccessAnalyseSource(sourceFile, sourceFile.InfoSourceProcess); if (!successGetSourceInfo) { return(fileContainer.ProgressToken); } // si ipfs add source demandé ou dépassement de la durée max if (IpfsSettings.Instance.AddVideoSource || sourceFile.HasReachMaxVideoDurationForEncoding()) { sourceFile.AddIpfsProcess(sourceFile.SourceFilePath); IpfsDaemon.Instance.Queue(sourceFile); } if (!sourceFile.HasReachMaxVideoDurationForEncoding()) { VideoSize[] requestFormats = GetVideoSizes(videoEncodingFormats); VideoSize[] authorizedFormats = GetVideoSizes(VideoSettings.Instance.AuthorizedQuality); IList <VideoSize> formats = requestFormats .Intersect(authorizedFormats) .OrderBy(v => v.QualityOrder) .ToList(); // suppression des formats à encoder avec une qualité/bitrate/nbframe/resolution... supérieure foreach (VideoSize videoSize in formats.ToList()) { if (sourceFile.VideoHeight <= videoSize.MinSourceHeightForEncoding) { formats.Remove(videoSize); } } // si sprite demandé if (sprite ?? false) { fileContainer.AddSprite(); // si pas d'encoding à faire, il faut lancer le sprite de suite car sinon il ne sera pas lancé à la fin de l'encoding if (!formats.Any()) { SpriteDaemon.Instance.Queue(fileContainer.SpriteVideoFileItem, "Waiting sprite creation..."); } } // s'il y a de l'encoding à faire if (formats.Any()) { // ajouter les formats à encoder fileContainer.AddEncodedVideo(formats); if (VideoSettings.Instance.GpuEncodeMode) { sourceFile.AddGpuEncodeProcess(); // encoding audio de la source puis ça sera encoding videos Gpu AudioCpuEncodeDaemon.Instance.Queue(sourceFile, "waiting audio encoding..."); } else { // si encoding est demandé, et gpuMode -> encodingAudio foreach (FileItem file in fileContainer.EncodedFileItems) { file.AddCpuEncodeProcess(); AudioVideoCpuEncodeDaemon.Instance.Queue(file, "Waiting encode..."); } } } } return(fileContainer.ProgressToken); }
public static bool SuccessAnalyseSource(FileItem sourceFile, bool spriteMode, ProcessItem processItem) { if (sourceFile == null) { throw new ArgumentNullException(nameof(sourceFile)); } if (sourceFile == null) { throw new ArgumentNullException(nameof(sourceFile)); } if (!sourceFile.IsSource) { throw new ArgumentException("Doit être le fichier source", nameof(sourceFile)); } // Récupérer la durée totale de la vidéo et sa résolution if (!sourceFile.VideoDuration.HasValue) { lock (sourceFile) { if (!sourceFile.VideoDuration.HasValue) { string imageOutputPath = Path.ChangeExtension(TempFileManager.GetNewTempFilePath(), ".jpeg"); try { var ffmpegProcessManager = new FfmpegProcessManager(sourceFile, sourceFile.InfoSourceProcess); string argumentsImage = $"-y -i {Path.GetFileName(sourceFile.SourceFilePath)} -vf fps=1 -vframes 1 {Path.GetFileName(imageOutputPath)}"; ffmpegProcessManager.StartProcess(argumentsImage, VideoSettings.EncodeGetOneImageTimeout); using (Image image = Image.FromFile(imageOutputPath)) { sourceFile.VideoWidth = image.Width; sourceFile.VideoHeight = image.Height; } } catch (Exception ex) { Log(ex.ToString(), "Exception source info", spriteMode); sourceFile.VideoDuration = -1; //pour ne pas essayer de le recalculer sur une demande de video à encoder } TempFileManager.SafeDeleteTempFile(imageOutputPath); } } } // Si durée totale de vidéo, largeur hauteur non récupéré, on ne peut pas continuer if (!sourceFile.SuccessGetSourceInfo()) { string message = "Error while getting duration, height or width."; Log(message + " FileName : " + Path.GetFileName(sourceFile.SourceFilePath), "Error source info", spriteMode); if (!spriteMode && sourceFile.IpfsProcess == null) { sourceFile.AddIpfsProcess(sourceFile.SourceFilePath); IpfsDaemon.Instance.Queue(sourceFile); } processItem.SetErrorMessage(message); return(false); } int duration = sourceFile.VideoDuration.Value; Log("SourceVideoDuration " + duration + " / SourceVideoFileSize " + sourceFile.FileSize, "Info source", spriteMode); // Désactivation encoding et sprite si dépassement de la durée maximale if (sourceFile.HasReachMaxVideoDurationForEncoding()) { if (!spriteMode && sourceFile.IpfsProcess == null) { sourceFile.AddIpfsProcess(sourceFile.SourceFilePath); IpfsDaemon.Instance.Queue(sourceFile); } processItem.CancelCascade("Dépassement de la durée limite de la vidéo atteinte."); return(false); } return(true); }