Encode GIF without creating temp palette file

This commit is contained in:
Jaex 2019-08-06 23:52:40 +03:00
parent 9e0f4d98c6
commit eb491e8532
3 changed files with 11 additions and 40 deletions

View file

@ -101,39 +101,13 @@ public bool EncodeVideo(string input, string output)
return Run(Options.FFmpeg.FFmpegPath, Options.GetFFmpegCommands()); return Run(Options.FFmpeg.FFmpegPath, Options.GetFFmpegCommands());
} }
public bool EncodeGIF(string input, string output, string tempFolder) public bool EncodeGIF(string input, string output)
{
bool result;
string palettePath = Path.Combine(tempFolder, "FFmpeg-palette.png");
try
{ {
// https://ffmpeg.org/ffmpeg-filters.html#palettegen-1 // https://ffmpeg.org/ffmpeg-filters.html#palettegen-1
result = Run(Options.FFmpeg.FFmpegPath, string.Format("-y -i \"{0}\" -vf \"palettegen=stats_mode={2}\" \"{1}\"", input, palettePath, Options.FFmpeg.GIFStatsMode));
if (result)
{
if (File.Exists(palettePath))
{
// https://ffmpeg.org/ffmpeg-filters.html#paletteuse // https://ffmpeg.org/ffmpeg-filters.html#paletteuse
result = Run(Options.FFmpeg.FFmpegPath, string.Format("-y -i \"{0}\" -i \"{1}\" -lavfi \"paletteuse=dither={3}\" \"{2}\"", input, palettePath, output, Options.FFmpeg.GIFDither)); return Run(Options.FFmpeg.FFmpegPath,
} $"-y -i \"{input}\" -lavfi \"palettegen=stats_mode={Options.FFmpeg.GIFStatsMode}[palette]," +
else $"[0:v][palette]paletteuse=dither={Options.FFmpeg.GIFDither}\" \"{output}\"");
{
result = false;
}
}
}
finally
{
if (File.Exists(palettePath))
{
File.Delete(palettePath);
}
}
return result;
} }
private bool Run(string path, string args = null) private bool Run(string path, string args = null)

View file

@ -233,16 +233,13 @@ public void SaveAsGIF(string path, GIFQuality quality)
public bool FFmpegEncodeVideo(string input, string output) public bool FFmpegEncodeVideo(string input, string output)
{ {
Helpers.CreateDirectoryFromFilePath(output); Helpers.CreateDirectoryFromFilePath(output);
bool result = ffmpegCli.EncodeVideo(input, output); return ffmpegCli.EncodeVideo(input, output);
//DebugHelper.WriteLine("Video encoding result:\nInput file size: {0}\nOutput file size: {1}", new FileInfo(input).Length.ToSizeString(), new FileInfo(output).Length.ToSizeString());
return result;
} }
public bool FFmpegEncodeAsGIF(string sourceFilePath, string targetFilePath, string tempFolder) public bool FFmpegEncodeAsGIF(string input, string output)
{ {
Helpers.CreateDirectoryFromFilePath(targetFilePath); Helpers.CreateDirectoryFromFilePath(output);
Helpers.CreateDirectoryFromDirectoryPath(tempFolder); return ffmpegCli.EncodeGIF(input, output);
return ffmpegCli.EncodeGIF(sourceFilePath, targetFilePath, tempFolder);
} }
protected void OnRecordingStarted() protected void OnRecordingStarted()

View file

@ -303,7 +303,7 @@ private static string ProcessTwoPassEncoding(string input, TaskSettings taskSett
{ {
if (taskSettings.CaptureSettings.FFmpegOptions.VideoCodec == FFmpegVideoCodec.gif) if (taskSettings.CaptureSettings.FFmpegOptions.VideoCodec == FFmpegVideoCodec.gif)
{ {
screenRecorder.FFmpegEncodeAsGIF(input, output, Program.ToolsFolder); screenRecorder.FFmpegEncodeAsGIF(input, output);
} }
else else
{ {