public void GenerateScript(MediaEncoderSettings settings, bool preview, bool multiThreaded) { AviSynthScriptBuilder Script = new AviSynthScriptBuilder(settings.CustomScript); if (Script.IsEmpty) Script = MediaEncoderScript.GenerateVideoScript(settings, GetPreviewSourceFile(settings), preview, multiThreaded); else if (preview) { Script.RemoveMT(); Script.AppendLine(@"ConvertToRGB32(matrix=""Rec709"")"); } else if (!multiThreaded) Script.RemoveMT(); Script.WriteToFile(PathManager.PreviewScriptFile); settings.Save(PathManager.PreviewSettingsFile); }
/// <summary> /// Saves the audio output of specified script into a WAV file. /// </summary> /// <param name="settings">An object containing the encoding settings.</param> /// <param name="destination">The WAV file to write.</param> /// <param name="options">The options that control the behaviors of the process.</param> public static void SaveAudioToWav(MediaEncoderSettings settings, string destination, ProcessStartOptions options) { string TempFile = settings.TempFile + ".avs"; AviSynthScriptBuilder Script = new AviSynthScriptBuilder(); if (settings.VideoAction != VideoAction.Copy) { // Read source script. Script.Script = File.ReadAllText(settings.ScriptFile); // Remote MT code. Script.RemoveMT(); Script.AppendLine("Trim(0,0)"); } else { // Read full video file. Script.AddPluginPath(); if (settings.ConvertToAvi || settings.InputFile.ToLower().EndsWith(".avi")) { Script.OpenAvi(settings.InputFile, !string.IsNullOrEmpty(settings.SourceAudioFormat)); } else { Script.OpenDirect(settings.InputFile, !string.IsNullOrEmpty(settings.SourceAudioFormat)); } Script.AppendLine("KillVideo()"); } Script.AppendLine(); // Add audio gain. if (settings.AudioGain.HasValue && settings.AudioGain != 0) { Script.AppendLine("AmplifydB({0})", settings.AudioGain.Value); } if (settings.ChangeAudioPitch) { // Change pitch to 432hz. Script.LoadPluginDll("TimeStretch.dll"); Script.AppendLine("ResampleAudio(48000)"); Script.AppendLine("TimeStretchPlugin(pitch = 100.0 * 0.98181819915771484)"); } // Add TWriteWAV. Script.AppendLine(); Script.LoadPluginDll("TWriteAVI.dll"); Script.AppendLine(@"TWriteWAV(""{0}"", true)", Script.GetAsciiPath(destination)); Script.AppendLine("ForceProcessWAV()"); // Write temp script. Script.WriteToFile(TempFile); // Execute. It aways returns an error but the file is generated. FFmpegProcess Worker = new FFmpegProcess(options); Worker.RunAvisynth(TempFile); File.Delete(TempFile); }
/// <summary> /// Gets an AviSynth clip information by running a script that outputs the frame count to a file. /// </summary> /// <param name="source">The AviSynth script to get information for.</param> /// <param name="silent">If true, the x264 window will be hidden.</param> /// <returns>The clip information.</returns> public static ClipInfo GetClipInfo(MediaEncoderSettings settings, string scriptFile, bool silent) { string TempScript = settings.TempFile + ".avs"; string TempResult = settings.TempFile + ".txt"; string TempOut = settings.TempFile + ".y4m"; // Read source script and remove MT. Also remove Deshaker if present. string FileContent = File.ReadAllText(scriptFile); FileContent.Replace(Environment.NewLine + "Deshaker", Environment.NewLine + "#Deshaker"); AviSynthScriptBuilder Script = new AviSynthScriptBuilder(FileContent); Script.RemoveMT(); //Script.DitherOut(false); // Get frame count. Script.AppendLine(); Script.AppendLine(@"WriteFileStart(""{0}"", ""FrameRate""{1}""Framecount"")", TempResult, @", """""" "","" """""", "); Script.AppendLine("Trim(0,-1)"); Script.WriteToFile(TempScript); // Run script. Run(@"Encoder\avs2yuv.exe", String.Format(@"""{0}"" -o {1}", TempScript, TempOut), true); // Read frame count ClipInfo Result = null; if (File.Exists(TempResult)) { string FileString = File.ReadAllText(TempResult); string[] FileValues = FileString.Split(','); Result = new ClipInfo(); try { Result.FrameRate = float.Parse(FileValues[0], CultureInfo.InvariantCulture); Result.FrameCount = int.Parse(FileValues[1]); } catch { Result = null; } } // Delete temp files. File.Delete(TempScript); File.Delete(TempResult); File.Delete(TempOut); // Dummy file that received avs2yuv output. return(Result); }