private static string GetSize(VideoSize videoSize, int width, int height) { switch (videoSize) { case VideoSize.F240p: { Tuple <int, int> finalSize = SizeHelper.GetSize(width, height, 426, 240); return($"{finalSize.Item1}:{finalSize.Item2}"); } case VideoSize.F360p: { Tuple <int, int> finalSize = SizeHelper.GetSize(width, height, 640, 360); return($"{finalSize.Item1}:{finalSize.Item2}"); } case VideoSize.F480p: { Tuple <int, int> finalSize = SizeHelper.GetSize(width, height, 854, 480); return($"{finalSize.Item1}:{finalSize.Item2}"); } case VideoSize.F720p: { Tuple <int, int> finalSize = SizeHelper.GetSize(width, height, 1280, 720); return($"{finalSize.Item1}:{finalSize.Item2}"); } case VideoSize.F1080p: { Tuple <int, int> finalSize = SizeHelper.GetSize(width, height, 1920, 1080); return($"{finalSize.Item1}:{finalSize.Item2}"); } default: throw new InvalidOperationException("Format non reconnu."); } }
public static bool Encode(FileItem fileItem) { FileItem sourceFile = fileItem.FileContainer.SourceFileItem; try { fileItem.SpriteEncodeProcess.StartProcessDateTime(); LogManager.AddSpriteMessage(LogLevel.Information, "SourceFilePath " + Path.GetFileName(fileItem.SourceFilePath), "Start Sprite"); int nbImages = VideoSettings.Instance.NbSpriteImages; int heightSprite = VideoSettings.Instance.HeightSpriteImages; // Calculer nb image/s // si < 100s de vidéo -> 1 image/s // sinon (nb secondes de la vidéo / 100) image/s string frameRate = "1"; int duration = sourceFile.VideoDuration.Value; if (duration > nbImages) { frameRate = $"{nbImages}/{duration}"; //frameRate = inverse de image/s } int spriteWidth = SizeHelper.GetWidth(sourceFile.VideoWidth.Value, sourceFile.VideoHeight.Value, heightSprite); string sizeImageMax = $"scale={spriteWidth}:{heightSprite}"; // Extract frameRate image/s de la video string arguments = $"-y -i {Path.GetFileName(fileItem.SourceFilePath)} -r {frameRate} -vf {sizeImageMax} -f image2 {GetPattern(fileItem.TempFilePath)}"; var ffmpegProcessManager = new FfmpegProcessManager(fileItem, fileItem.SpriteEncodeProcess); ffmpegProcessManager.StartProcess(arguments, VideoSettings.Instance.EncodeGetImagesTimeout); IList <string> files = GetListImageFrom(fileItem.TempFilePath); // récupération des images LogManager.AddSpriteMessage(LogLevel.Information, (files.Count - 1) + " images", "Start Combine images"); // garder que les 100 dernières images pour éliminer les premières (1 ou 2 en réalité) int skip = files.Count > VideoSettings.Instance.NbSpriteImages ? files.Count - VideoSettings.Instance.NbSpriteImages : 0; var list = new StringBuilder(); foreach (string imagePath in files.Skip(skip)) { if (list.Length > 0) { list.Append(" "); } list.Append(Path.GetFileName(imagePath)); } arguments = $"montage -mode concatenate -tile 1x {list} {Path.GetFileName(fileItem.TempFilePath)}"; var process = new ProcessManager(Path.Combine(GeneralSettings.Instance.ImageMagickPath, "magick"), arguments, LogManager.SpriteLogger); bool successSprite = process.Launch(5); TempFileManager.SafeDeleteTempFiles(files); // suppression des images if (!successSprite) { fileItem.SpriteEncodeProcess.SetErrorMessage("Error while combine images", "Error creation sprite while combine images"); return(false); } fileItem.ReplaceOutputPathWithTempPath(); LogManager.AddSpriteMessage(LogLevel.Information, "OutputFileName " + Path.GetFileName(fileItem.OutputFilePath) + " / FileSize " + fileItem.FileSize, "End Sprite"); fileItem.SpriteEncodeProcess.EndProcessDateTime(); return(true); } catch (Exception ex) { string message = "Video Duration " + sourceFile.VideoDuration + " / FileSize " + fileItem.FileSize + " / Progress " + fileItem.SpriteEncodeProcess.Progress; fileItem.SpriteEncodeProcess.SetErrorMessage("Exception non gérée", message, ex); IList <string> files = GetListImageFrom(fileItem.TempFilePath); // récupération des images TempFileManager.SafeDeleteTempFiles(files); // suppression des images return(false); } }
private static string GetSize(VideoSize videoSize, int width, int height) { Tuple <int, int> finalSize = SizeHelper.GetSize(width, height, videoSize.Width, videoSize.Height); return($"{finalSize.Item1}:{finalSize.Item2}"); }