Compare commits
7 Commits
Author | SHA1 | Date |
---|---|---|
zabpehely | 2dcfa5132b | |
LouisLam | ac63e215ff | |
LouisLam | d9b13cb1a7 | |
LouisLam | 01bbdde60c | |
LouisLam | a5cfc0e42d | |
LouisLam | 37c1e1b6bc | |
LouisLam | 31c292f7be |
|
@ -30,6 +30,11 @@
|
||||||
this.button2 = new System.Windows.Forms.Button();
|
this.button2 = new System.Windows.Forms.Button();
|
||||||
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
|
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
|
||||||
this.buttonContextMenu = new System.Windows.Forms.Button();
|
this.buttonContextMenu = new System.Windows.Forms.Button();
|
||||||
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
|
this.dataGridView1 = new System.Windows.Forms.DataGridView();
|
||||||
|
this.FilePath = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||||
|
this.Status = new System.Windows.Forms.DataGridViewTextBoxColumn();
|
||||||
|
((System.ComponentModel.ISupportInitialize) (this.dataGridView1)).BeginInit();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// button1
|
// button1
|
||||||
|
@ -66,7 +71,7 @@
|
||||||
//
|
//
|
||||||
// linkLabel1
|
// linkLabel1
|
||||||
//
|
//
|
||||||
this.linkLabel1.Location = new System.Drawing.Point(314, 93);
|
this.linkLabel1.Location = new System.Drawing.Point(315, 276);
|
||||||
this.linkLabel1.Name = "linkLabel1";
|
this.linkLabel1.Name = "linkLabel1";
|
||||||
this.linkLabel1.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
|
this.linkLabel1.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
|
||||||
this.linkLabel1.Size = new System.Drawing.Size(284, 23);
|
this.linkLabel1.Size = new System.Drawing.Size(284, 23);
|
||||||
|
@ -85,12 +90,50 @@
|
||||||
this.buttonContextMenu.UseVisualStyleBackColor = true;
|
this.buttonContextMenu.UseVisualStyleBackColor = true;
|
||||||
this.buttonContextMenu.Click += new System.EventHandler(this.button3_Click);
|
this.buttonContextMenu.Click += new System.EventHandler(this.button3_Click);
|
||||||
//
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
this.label1.Location = new System.Drawing.Point(12, 99);
|
||||||
|
this.label1.Name = "label1";
|
||||||
|
this.label1.Size = new System.Drawing.Size(100, 23);
|
||||||
|
this.label1.TabIndex = 7;
|
||||||
|
this.label1.Text = "Task List";
|
||||||
|
//
|
||||||
|
// dataGridView1
|
||||||
|
//
|
||||||
|
this.dataGridView1.AllowUserToAddRows = false;
|
||||||
|
this.dataGridView1.AllowUserToDeleteRows = false;
|
||||||
|
this.dataGridView1.BackgroundColor = System.Drawing.SystemColors.ButtonHighlight;
|
||||||
|
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||||
|
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {this.FilePath, this.Status});
|
||||||
|
this.dataGridView1.Location = new System.Drawing.Point(12, 120);
|
||||||
|
this.dataGridView1.Name = "dataGridView1";
|
||||||
|
this.dataGridView1.ReadOnly = true;
|
||||||
|
this.dataGridView1.RowTemplate.Height = 24;
|
||||||
|
this.dataGridView1.Size = new System.Drawing.Size(586, 141);
|
||||||
|
this.dataGridView1.TabIndex = 8;
|
||||||
|
//
|
||||||
|
// FilePath
|
||||||
|
//
|
||||||
|
this.FilePath.HeaderText = "File Path";
|
||||||
|
this.FilePath.Name = "FilePath";
|
||||||
|
this.FilePath.ReadOnly = true;
|
||||||
|
this.FilePath.Width = 272;
|
||||||
|
//
|
||||||
|
// Status
|
||||||
|
//
|
||||||
|
this.Status.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
|
||||||
|
this.Status.HeaderText = "Status";
|
||||||
|
this.Status.Name = "Status";
|
||||||
|
this.Status.ReadOnly = true;
|
||||||
|
//
|
||||||
// Form1
|
// Form1
|
||||||
//
|
//
|
||||||
this.AllowDrop = true;
|
this.AllowDrop = true;
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
||||||
this.ClientSize = new System.Drawing.Size(610, 125);
|
this.ClientSize = new System.Drawing.Size(610, 307);
|
||||||
|
this.Controls.Add(this.dataGridView1);
|
||||||
|
this.Controls.Add(this.label1);
|
||||||
this.Controls.Add(this.buttonContextMenu);
|
this.Controls.Add(this.buttonContextMenu);
|
||||||
this.Controls.Add(this.linkLabel1);
|
this.Controls.Add(this.linkLabel1);
|
||||||
this.Controls.Add(this.button2);
|
this.Controls.Add(this.button2);
|
||||||
|
@ -100,10 +143,12 @@
|
||||||
this.Name = "Form1";
|
this.Name = "Form1";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||||
this.Text = "Lazy Compress H.265 (HEVC)";
|
this.Text = "Lazy Compress H.265 (HEVC)";
|
||||||
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
|
||||||
this.Load += new System.EventHandler(this.Form1_Load);
|
this.Load += new System.EventHandler(this.Form1_Load);
|
||||||
this.Shown += new System.EventHandler(this.Form1_Shown);
|
this.Shown += new System.EventHandler(this.Form1_Shown);
|
||||||
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop);
|
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop);
|
||||||
this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
|
this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
|
||||||
|
((System.ComponentModel.ISupportInitialize) (this.dataGridView1)).EndInit();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
this.PerformLayout();
|
||||||
}
|
}
|
||||||
|
@ -111,8 +156,12 @@
|
||||||
private System.Windows.Forms.Button button1;
|
private System.Windows.Forms.Button button1;
|
||||||
private System.Windows.Forms.Button button2;
|
private System.Windows.Forms.Button button2;
|
||||||
private System.Windows.Forms.Button buttonContextMenu;
|
private System.Windows.Forms.Button buttonContextMenu;
|
||||||
|
private System.Windows.Forms.DataGridView dataGridView1;
|
||||||
|
private System.Windows.Forms.DataGridViewTextBoxColumn FilePath;
|
||||||
|
private System.Windows.Forms.Label label1;
|
||||||
private System.Windows.Forms.LinkLabel linkLabel1;
|
private System.Windows.Forms.LinkLabel linkLabel1;
|
||||||
private System.Windows.Forms.OpenFileDialog openFileDialog1;
|
private System.Windows.Forms.OpenFileDialog openFileDialog1;
|
||||||
|
private System.Windows.Forms.DataGridViewTextBoxColumn Status;
|
||||||
private System.Windows.Forms.TextBox textBox1;
|
private System.Windows.Forms.TextBox textBox1;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
149
Form1.cs
149
Form1.cs
|
@ -18,6 +18,11 @@ namespace CompressH265 {
|
||||||
|
|
||||||
private bool isFromContextMenu = false;
|
private bool isFromContextMenu = false;
|
||||||
private bool installed = false;
|
private bool installed = false;
|
||||||
|
private int nextTaskID = 0;
|
||||||
|
|
||||||
|
private int runningProcessCount = 0;
|
||||||
|
|
||||||
|
private LinkedList<Process> processList = new LinkedList<Process>();
|
||||||
|
|
||||||
public Form1() {
|
public Form1() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
@ -84,43 +89,127 @@ namespace CompressH265 {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void button2_Click(object sender, EventArgs e) {
|
private void button2_Click(object sender, EventArgs e) {
|
||||||
|
var inputFilename = textBox1.Text;
|
||||||
|
var shortName = Path.GetFileName(inputFilename);
|
||||||
|
|
||||||
if (textBox1.Text.Trim() == "") {
|
if (inputFilename.Trim() == "") {
|
||||||
MessageBox.Show("Please select or drag-and-drop a file.");
|
MessageBox.Show("Please select or drag-and-drop a file.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!File.Exists(textBox1.Text)) {
|
if (!File.Exists(inputFilename)) {
|
||||||
MessageBox.Show("File Not Found");
|
MessageBox.Show("File Not Found");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var creationTime = File.GetCreationTime(inputFilename);
|
||||||
|
var lastAccessTime = File.GetLastAccessTime(inputFilename);
|
||||||
|
var lastWriteTime = File.GetLastWriteTime(inputFilename);
|
||||||
|
|
||||||
Process process = new Process();
|
Process process = new Process();
|
||||||
process.EnableRaisingEvents = true;
|
process.EnableRaisingEvents = true;
|
||||||
// process.StartInfo.RedirectStandardOutput = true;
|
|
||||||
// process.StartInfo.RedirectStandardError = true;
|
|
||||||
|
|
||||||
var outputFilename = textBox1.Text + ".h265.mp4";
|
var outputFilename = inputFilename + ".h265.mp4";
|
||||||
|
|
||||||
process.StartInfo.FileName = "cmd.exe";
|
if (File.Exists(outputFilename)) {
|
||||||
process.StartInfo.Arguments = $"/K ffmpeg.exe -i \"{textBox1.Text}\" -vcodec hevc -map_metadata 0 \"{outputFilename}\"";
|
MessageBox.Show("The output file name is existing. Please move or delete it before converting. " + outputFilename);
|
||||||
process.StartInfo.UseShellExecute = false;
|
return;
|
||||||
// process.StartInfo.CreateNoWindow = true;
|
|
||||||
|
|
||||||
process.Exited += (sender2, e2) => {
|
|
||||||
System.Environment.Exit(1);
|
|
||||||
};
|
|
||||||
|
|
||||||
// process.OutputDataReceived += OnProcessOutput;
|
|
||||||
// process.ErrorDataReceived += OnProcessOutput;
|
|
||||||
process.Start();
|
|
||||||
|
|
||||||
// process.BeginErrorReadLine();
|
|
||||||
// process.BeginOutputReadLine();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnProcessOutput(object send, DataReceivedEventArgs args) {
|
// Get FPS
|
||||||
// textBox2.Text += args.Data;
|
var fps = GetFPS(inputFilename);
|
||||||
|
var fpsParam = "";
|
||||||
|
|
||||||
|
if (fps > 0) {
|
||||||
|
fpsParam = "-r " + fps;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Converting
|
||||||
|
process.StartInfo.FileName = "ffmpeg.exe";
|
||||||
|
process.StartInfo.Arguments = $" -i \"{inputFilename}\" -vcodec hevc -map_metadata 0 -vf yadif -crf 20 -preset medium {fpsParam} \"{outputFilename}\"";
|
||||||
|
process.StartInfo.UseShellExecute = false;
|
||||||
|
process.StartInfo.CreateNoWindow = true;
|
||||||
|
|
||||||
|
MessageBox.Show(process.StartInfo.Arguments);
|
||||||
|
|
||||||
|
var rowID = nextTaskID++;
|
||||||
|
var msgQueue = new Queue<string>();
|
||||||
|
dataGridView1.Rows.Insert(rowID, shortName, "Preparing...");
|
||||||
|
var row = dataGridView1.Rows[rowID];
|
||||||
|
|
||||||
|
process.StartInfo.RedirectStandardError = true;
|
||||||
|
process.ErrorDataReceived += (errorEvent,errorArgs) => {
|
||||||
|
if (errorArgs.Data == null || errorArgs.Data.Trim() == "") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
msgQueue.Enqueue(errorArgs.Data);
|
||||||
|
|
||||||
|
if (msgQueue.Count == 5) {
|
||||||
|
msgQueue.Dequeue();
|
||||||
|
}
|
||||||
|
|
||||||
|
row.Cells[1].Value = String.Join(" | ", msgQueue.Reverse());
|
||||||
|
};
|
||||||
|
|
||||||
|
process.Exited += (sender2, e2) => {
|
||||||
|
|
||||||
|
if (File.Exists(outputFilename)) {
|
||||||
|
File.SetCreationTime(outputFilename, creationTime);
|
||||||
|
File.SetLastAccessTime(outputFilename, lastAccessTime);
|
||||||
|
File.SetLastWriteTime(outputFilename, lastWriteTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgQueue.Enqueue("Finish");
|
||||||
|
row.Cells[1].Value = String.Join(" | ", msgQueue.Reverse());
|
||||||
|
|
||||||
|
if (isFromContextMenu) {
|
||||||
|
//System.Environment.Exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
runningProcessCount--;
|
||||||
|
};
|
||||||
|
|
||||||
|
runningProcessCount++;
|
||||||
|
process.Start();
|
||||||
|
process.BeginErrorReadLine();
|
||||||
|
|
||||||
|
processList.AddLast(process);
|
||||||
|
}
|
||||||
|
|
||||||
|
private float GetFPS(string inputFilename) {
|
||||||
|
Process process = new Process();
|
||||||
|
process.StartInfo.FileName = "ffmpeg.exe";
|
||||||
|
process.StartInfo.Arguments = $"-i \"{inputFilename}\"";
|
||||||
|
process.StartInfo.UseShellExecute = false;
|
||||||
|
process.StartInfo.CreateNoWindow = true;
|
||||||
|
process.StartInfo.RedirectStandardError = true;
|
||||||
|
process.Start();
|
||||||
|
process.WaitForExit();
|
||||||
|
string err = process.StandardError.ReadToEnd();
|
||||||
|
|
||||||
|
var end = err.IndexOf(" fps,");
|
||||||
|
|
||||||
|
if (end < 0) {
|
||||||
|
return -1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = end;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (err[start - 1] == ' ') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
start--;
|
||||||
|
|
||||||
|
if (start < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return float.Parse(err.Substring(start, end - start));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void button3_Click(object sender, EventArgs e) {
|
private void button3_Click(object sender, EventArgs e) {
|
||||||
|
@ -166,12 +255,26 @@ namespace CompressH265 {
|
||||||
|
|
||||||
private void Form1_Shown(object sender, EventArgs e) {
|
private void Form1_Shown(object sender, EventArgs e) {
|
||||||
if (isFromContextMenu) {
|
if (isFromContextMenu) {
|
||||||
Hide();
|
//Hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
|
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
|
||||||
System.Diagnostics.Process.Start("https://github.com/louislam/lazy-compress-h265");
|
System.Diagnostics.Process.Start("https://github.com/louislam/lazy-compress-h265");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
|
||||||
|
if (runningProcessCount > 0) {
|
||||||
|
var result = MessageBox.Show("Are you sure want to stop the processing?", "Stop process", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
||||||
|
|
||||||
|
if (result == DialogResult.Yes) {
|
||||||
|
foreach (var p in processList) {
|
||||||
|
p.Kill();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
e.Cancel = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -120,4 +120,10 @@
|
||||||
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>23, 17</value>
|
<value>23, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="FilePath.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>True</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="Status.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>True</value>
|
||||||
|
</metadata>
|
||||||
</root>
|
</root>
|
|
@ -1,7 +1,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
@ -15,6 +17,12 @@ namespace CompressH265 {
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args) {
|
static void Main(string[] args) {
|
||||||
|
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
||||||
|
|
||||||
|
if (path != null) {
|
||||||
|
Environment.CurrentDirectory = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
foreach(var item in args)
|
foreach(var item in args)
|
||||||
{
|
{
|
||||||
|
|
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
[assembly: AssemblyVersion("1.3.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
[assembly: AssemblyFileVersion("1.3.0.0")]
|
|
@ -7,7 +7,7 @@ Compress or convert your video files to h.265 (hevc) format with one-click, make
|
||||||
|
|
||||||
# Download
|
# Download
|
||||||
|
|
||||||
https://github.com/louislam/lazy-compress-h265/releases
|
https://gitea.ath.cx/zabpehely/lazy-compress-h265/releases
|
||||||
|
|
||||||
# Features
|
# Features
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ https://github.com/louislam/lazy-compress-h265/releases
|
||||||
* No config is required
|
* No config is required
|
||||||
* Easy to use, drag-and-drop and compress
|
* Easy to use, drag-and-drop and compress
|
||||||
* Alternative, you could install to your Context Menu, one-click to compress
|
* Alternative, you could install to your Context Menu, one-click to compress
|
||||||
|
* Keep metadata, date created and date modified.
|
||||||
* Output to the same folder with postfix ".h265.mp4"
|
* Output to the same folder with postfix ".h265.mp4"
|
||||||
* Portable
|
* Portable
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue