Esempio n. 1
0
        /// <summary>
        /// Save the image to the specified path then dispose the Image object.
        /// </summary>
        /// <param name="img">Image to save</param>
        /// <param name="path">Full path including file name and extension to save the image to</param>
        /// <param name="quality">Image save quality (0 - 100)</param>
        public static void SaveAs(this Image img, string path, int quality = 95)
        {
            using (var myEncoderParameters = new EncoderParameters(1))
            {
                var myEncoder = Encoder.Quality;
                using (var myEncoderParameter = new EncoderParameter(myEncoder, (long)quality))
                {
                    myEncoderParameters.Param[0] = myEncoderParameter;

                    using (img)
                    {
                        var dotIndex         = path.LastIndexOf('.');
                        var ext              = path.Substring(dotIndex, path.Length - dotIndex - 1);
                        var myImageCodecInfo = EncoderInfo.GetEncoderInfo(ext);

                        img.Save(path, myImageCodecInfo, myEncoderParameters);
                    }
                }
            }
        }
Esempio n. 2
0
        public string Encode(EncoderInfo theEncoderInfo)
        {
            Log.Info("Start of encoding bitmaps into video stream...");

            //Audio-Video maker process
            using (var aVMaker = new Process())
            {
                aVMaker.StartInfo.FileName = Path.Combine(theEncoderInfo.ExePath, theEncoderInfo.ExeName);
                aVMaker.StartInfo.RedirectStandardOutput = true;
                aVMaker.StartInfo.RedirectStandardError  = true;
                aVMaker.EnableRaisingEvents = true;

#if DEBUG
                aVMaker.StartInfo.UseShellExecute = false;
                aVMaker.StartInfo.CreateNoWindow  = false;
#else
                aVMaker.StartInfo.UseShellExecute = false;
                aVMaker.StartInfo.CreateNoWindow  = true;
#endif
                var aOutFile = GetOutputFile(theEncoderInfo.HookId);

                //avMaker.StartInfo.Arguments = String.Format(@"-i bitmaps\{0} -vcodec huffyuv output.avi", pngLoc);
                //avMaker.StartInfo.Arguments = String.Format(@"-i bitmaps\{0} -r 20 output.mp4", pngLoc);

                aVMaker.StartInfo.Arguments = theEncoderInfo.Arguments + "\\" + aOutFile;
                // String.Format(@"-i {0} -r {2} -c:v libx264 -preset slow -crf 21 {1}", ifile, outFile, Settings.Default.FramesPerSec);
                // avMaker.StartInfo.Arguments = String.Format(@" -r 20 -i bitmaps\{0} -c:v libx264 -r 20 -pix_fmt yuv420p output.mp4", pngLoc);

                var aOutput = new StringBuilder();
                var aError  = new StringBuilder();

                using (var aOutputWaitHandle = new AutoResetEvent(false))
                {
                    using (var aErrorWaitHandle = new AutoResetEvent(false))
                    {
                        if (!aVMaker.Start())
                        {
                            Log.Error("Error in starting the FFMPEG process!");
                        }

                        aVMaker.OutputDataReceived += (theSender, theArgs) =>
                        {
                            if (theArgs.Data == null)
                            {
                                aOutputWaitHandle.Set();
                            }
                            else
                            {
                                aOutput.AppendLine(theArgs.Data);
                            }
                        };
                        aVMaker.ErrorDataReceived += (theSender, theArgs) =>
                        {
                            if (theArgs.Data == null)
                            {
                                aErrorWaitHandle.Set();
                            }
                            else
                            {
                                aError.AppendLine(theArgs.Data);
                            }
                        };


                        aVMaker.BeginOutputReadLine();
                        aVMaker.BeginErrorReadLine();

                        // Log FFMPEG output and errors
                        Log.Info(aOutput);
                        Log.Error(aError);

                        if (aVMaker.WaitForExit(int.MaxValue) &&
                            aOutputWaitHandle.WaitOne() &&
                            aErrorWaitHandle.WaitOne())
                        {
                            // Process completed. Check process.ExitCode here.
                            Log.Info("FFMPEG Process completed with exit code:" + aVMaker.ExitCode);
                        }
                        else
                        {
                            // Timed out.
                            Log.Info("FFMPEG Process timeout!");
                        }

                        return(aOutFile);
                    }
                }
            }
        }