예제 #1
0
        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.");
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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}");
        }