Skip to content

Commit

Permalink
add ffmpeg pipe mode
Browse files Browse the repository at this point in the history
  • Loading branch information
zyzsdy committed Aug 6, 2018
1 parent 89321cb commit d8405f3
Show file tree
Hide file tree
Showing 5 changed files with 202 additions and 2 deletions.
28 changes: 28 additions & 0 deletions NegativeEncoder/EncodingQueue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,34 @@ private void NewTask_Destroyed(object sender)
{
Remove((EncodingTask)sender);
}

internal EncodingTask AddFFPWithAudioEncodingTask(string baseDir, string input, string output, Config config)
{
var name = System.IO.Path.GetFileName(output);
var newTask = new EncodingTask(name, EncodingType.SimpleWithAudio);
newTask.Destroyed += NewTask_Destroyed;

var fileargs = TaskBuilder.FFPWithAudioEncodingTaskBuilder(baseDir, input, output, config);
newTask.Start(fileargs.Item1, fileargs.Item2);
newTask.RunLog += fileargs.Item1 + " " + fileargs.Item2 + "\n";
Add(newTask);

return newTask;
}

internal EncodingTask AddFFPEncodingTask(string baseDir, string input, string output, Config config)
{
var name = System.IO.Path.GetFileName(output);
var newTask = new EncodingTask(name, EncodingType.SimpleWithAudio);
newTask.Destroyed += NewTask_Destroyed;

var fileargs = TaskBuilder.FFPEncodingTaskBuilder(baseDir, input, output, config);
newTask.Start(fileargs.Item1, fileargs.Item2);
newTask.RunLog += fileargs.Item1 + " " + fileargs.Item2 + "\n";
Add(newTask);

return newTask;
}
}

public static class ProcessEx
Expand Down
9 changes: 8 additions & 1 deletion NegativeEncoder/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NegativeEncoder"
mc:Ignorable="d"
Title="消极压制" Height="372" Width="580" Loaded="Window_Loaded">
Title="消极压制" Height="500" Width="580" Loaded="Window_Loaded">
<Grid>
<TabControl>
<TabItem Header="视频">
Expand Down Expand Up @@ -100,6 +100,13 @@

</Grid>
</TabItem>
<TabItem Header="常用">
<Grid>
<GroupBox Header="FFmpeg Pipe" Height="58" VerticalAlignment="Top" Margin="10,10,10,0">
<Button x:Name="startFFPEncodingButton" Content="开始压制" Margin="0,10,10,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="74" Height="22" Click="startFFPEncodingButton_Click"/>
</GroupBox>
</Grid>
</TabItem>
<TabItem Header="选项">
<Grid>
<Label Content="编码器" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
Expand Down
30 changes: 30 additions & 0 deletions NegativeEncoder/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -744,5 +744,35 @@ private void simpleResizeY_TextChanged(object sender, TextChangedEventArgs e)
{
if (config != null) config.ResizeYValue = simpleResizeY.Text;
}

private void startFFPEncodingButton_Click(object sender, RoutedEventArgs e)
{
if (videoInputTextBox.Text == "" || videoSaveTextBox.Text == "")
{
MessageBox.Show("输入和输出都不能为空");
return;
}
EncodingTask t;
if (isAudioEncodeCheckBox.IsChecked == true)
{
t = encodingQueue.AddFFPWithAudioEncodingTask(baseDir, videoInputTextBox.Text, videoSaveTextBox.Text, config);
}
else
{
t = encodingQueue.AddFFPEncodingTask(baseDir, videoInputTextBox.Text, videoSaveTextBox.Text, config);
}
startFFPEncodingButton.IsEnabled = false;
startFFPEncodingButton.Content = "请等待...";
Task.Run(() =>
{
Thread.Sleep(3000);
Dispatcher.Invoke(() =>
{
startFFPEncodingButton.IsEnabled = true;
startFFPEncodingButton.Content = "开始压制";
OpenTaskDetailWindow(t);
});
});
}
}
}
132 changes: 132 additions & 0 deletions NegativeEncoder/TaskBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,138 @@ public static Tuple<string, string> SimpleWithAudioEncodingTaskBuilder(string ba
return new Tuple<string, string>(executableEncodingFileName, arguments);
}

internal static Tuple<string, string> FFPWithAudioEncodingTaskBuilder(string baseDir, string input, string output, Config config)
{
//temp work dir
string workDir = System.IO.Path.GetDirectoryName(output);
string videoName = System.IO.Path.GetFileNameWithoutExtension(output) + "_videoTemp.mp4";
string videoFullname = System.IO.Path.Combine(workDir, videoName);
string aacName = System.IO.Path.GetFileNameWithoutExtension(output) + "_aacTemp.aac";
string aacFullname = System.IO.Path.Combine(workDir, aacName);
//build bat
string batName = System.IO.Path.GetFileNameWithoutExtension(output) + "_ffpWithAudioBatTemp.bat";
string batFullname = System.IO.Path.Combine(workDir, batName);

var batSb = new StringBuilder();
batSb.Append("@echo off\n");

var ffmpegFile = System.IO.Path.Combine(baseDir, "Lib\\ffmpeg.exe");
var mp4boxFile = System.IO.Path.Combine(baseDir, "Lib\\MP4Box.exe");
var executableEncodingFileName = GetBaseEncoderFile(baseDir, config);
string gargs = GenericArgumentBuilder(config);

var addArgList = new List<string>();

if (config.IsSetResize)
{
addArgList.Add("--output-res");
addArgList.Add(String.Format("{0}x{1}", config.ResizeXValue ?? "1920", config.ResizeYValue ?? "1080"));
}

if (config.IsAudioFix)
{
addArgList.Add("--avsync");
if (!config.IsInterlaceSource)
{
addArgList.Add("forcecfr");
}
else if ((config.ActiveDeintOption ?? DeintOption.NORMAL) == DeintOption.NORMAL)
{
addArgList.Add("forcecfr");
}
else
{
addArgList.Add("vfr");
}
}

string addargs = String.Join(" ", addArgList);

batSb.AppendFormat("\"{0}\" -y -i \"{1}\" -an -pix_fmt yuv420p -f yuv4mpegpipe - | \"{2}\" --y4m -i - -o \"{3}\" {4} {5}\n",
ffmpegFile,
input,
executableEncodingFileName,
videoFullname,
gargs,
addargs);
batSb.AppendFormat("\"{0}\" -i \"{1}\" -vn -sn -c:a copy -y -map 0:a:0 \"{2}\"\n",
ffmpegFile,
input,
aacFullname);
batSb.AppendFormat("\"{0}\" -add \"{1}#trackID=1:par=1:1:name=\" -add \"{2}:name=\" -new \"{3}\"\n",
mp4boxFile,
videoFullname,
aacFullname,
output);

batSb.AppendFormat("@del \"{0}\"\n", videoFullname);
batSb.AppendFormat("@del \"{0}\"\n", aacFullname);
batSb.AppendFormat("@del \"{0}\"\n", batFullname);

//save bat
TempFileHelper(batFullname, batSb.ToString());

return new Tuple<string, string>(batFullname, "");
}

internal static Tuple<string, string> FFPEncodingTaskBuilder(string baseDir, string input, string output, Config config)
{
//temp work dir
string workDir = System.IO.Path.GetDirectoryName(output);

//build bat
string batName = System.IO.Path.GetFileNameWithoutExtension(output) + "_ffpBatTemp.bat";
string batFullname = System.IO.Path.Combine(workDir, batName);

var batSb = new StringBuilder();
batSb.Append("@echo off\n");

var ffmpegFile = System.IO.Path.Combine(baseDir, "Lib\\ffmpeg.exe");
var executableEncodingFileName = GetBaseEncoderFile(baseDir, config);
string gargs = GenericArgumentBuilder(config);

var addArgList = new List<string>();

if (config.IsSetResize)
{
addArgList.Add("--output-res");
addArgList.Add(String.Format("{0}x{1}", config.ResizeXValue ?? "1920", config.ResizeYValue ?? "1080"));
}

if (config.IsAudioFix)
{
addArgList.Add("--avsync");
if (!config.IsInterlaceSource)
{
addArgList.Add("forcecfr");
}
else if ((config.ActiveDeintOption ?? DeintOption.NORMAL) == DeintOption.NORMAL)
{
addArgList.Add("forcecfr");
}
else
{
addArgList.Add("vfr");
}
}

string addargs = String.Join(" ", addArgList);

batSb.AppendFormat("\"{0}\" -y -i \"{1}\" -an -pix_fmt yuv420p -f yuv4mpegpipe - | \"{2}\" --y4m -i - -o \"{3}\" {4} {5}\n",
ffmpegFile,
input,
executableEncodingFileName,
output,
gargs,
addargs);
batSb.AppendFormat("@del \"{0}\"\n", batFullname);

//save bat
TempFileHelper(batFullname, batSb.ToString());

return new Tuple<string, string>(batFullname, "");
}

public static Tuple<string, string> MKVBoxTaskBuilder(string baseDir, string videoInput, string audioInput, string output, Config config)
{
var mkvmergeFile = System.IO.Path.Combine(baseDir, "Lib\\mkvmerge.exe");
Expand Down
5 changes: 4 additions & 1 deletion NegativeEncoder/Version.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace NegativeEncoder
{
class Version
{
public const string VER = "0.2.0";
public const string VER = "0.2.1";
public static string AboutText = "Negative Encoder (消极压制) v" + VER + @"
By Zyzsdy
Expand Down Expand Up @@ -45,6 +45,9 @@ By Zyzsdy
---------------------------------------
更新记录
v0.2.1 (2018-8-6)
* 增加FFmpeg Pipe压制模式
v0.2.0 (2018-6-12)
* 删除VQP模式
* 简单压制选项中增加分辨率调整
Expand Down

0 comments on commit d8405f3

Please sign in to comment.