跳跃1步1%... 2%... 3%... 4%... 5% 现在发生的事情很少。首先,代码工作正常,后台工作者开始调用Convert方法,然后进入backgroundworker完成事件。不确定是否需要完成的事件。
你可以在button1点击事件中看到我第一次用帧数设置这个标签。和progressBar1最大值。
问题是:
在label12上,我看到290为progressBar1的最大值,但实际上只有280帧,在label14上显示有280帧数。
在这个过程的最后,我在label12上看到值281,但有280帧,为什么它计数到281?
标签上的百分比11根本没有移动,而是一直保持在0%。
在form1加载事件:
private void Form1_Load(object sender, EventArgs e)
{
RichTextBox1.Visible = false;
ProgressBar1.Value = 0;
Button5.Enabled = false;
KB = 1024;
MB = KB * 1024;
GB = MB * 1024;
psiProcInfo = new ProcessStartInfo();
prcFFMPEG = new Process();
}
按钮1单击事件
private void Button1_Click(object sender, EventArgs e)
{
OFD = new OpenFileDialog();
if (OFD.ShowDialog() == DialogResult.OK)
{
mFile = new MediaFile(OFD.FileName);
InputFile = OFD.FileName;
pathResult = Path.GetFileNameWithoutExtension(OFD.FileName);
Label3.Text = "Name: " + pathResult;
if (mFile.FileSize > 1070000000)
{
Label4.Text = "FileSize: " + String.Format("{0:0.00}", mFile.FileSize / KB / MB) + " GB.";
}
else
{
Label4.Text = "FileSize: " + String.Format("{0:0.00}", mFile.FileSize / MB) + " MB.";
}
Label5.Text = "Duration: " + mFile.Video[0].DurationString;
Label6.Text = "Format: " + mFile.Video[0].Format;
Label7.Text = "Codec: " + mFile.Video[0].CodecID;
Label8.Text = "Resolution: " + mFile.Video[0].FrameSize;
Label9.Text = "Framerate: " + mFile.Video[0].FrameRate;
Label14.Text = "NumberOfFrames: " + mFile.Video[0].SourceFile.FrameCount.ToString();
Label15.Text = "VideoStreams: " + mFile.Video[0].StreamType + " " + mFile.Video[0].StreamIndex;
FCount = int.Parse(mFile.Video[0].SourceFile.FrameCount.ToString());
ProgressBar1.Maximum = FCount + 10;
Label12.Text = ProgressBar1.Maximum.ToString();
}
}
转换方法,在那里我正在计算报告progressBar1和标签的进度。
private void Convert()
{
Control.CheckForIllegalCrossThreadCalls = false;
if (ComboBox1.SelectedIndex == 3)
{
strFFCMD = " -i \"" + InputFile + "\" \"" + OutputFile + "\"";
}
if (ComboBox1.SelectedIndex == 2)
{
strFFCMD = " -i " + (char)34 + InputFile + (char)34 +
" -c:v libx264 -s 1280x720 -pix_fmt yuv420p -qp 20 -profile high444-c:a libvo_aacenc -b:a 128k -ar 44100 -ac 2 " + OutputFile;
}
psiProcInfo.FileName = exepath;
psiProcInfo.Arguments = strFFCMD;
psiProcInfo.UseShellExecute = false;
psiProcInfo.WindowStyle = ProcessWindowStyle.Hidden;
psiProcInfo.RedirectStandardError = true;
psiProcInfo.RedirectStandardOutput = true;
psiProcInfo.CreateNoWindow = true;
prcFFMPEG.StartInfo = psiProcInfo;
prcFFMPEG.Start();
ffReader = prcFFMPEG.StandardError;
do
{
if (Bgw1.CancellationPending)
{
return;
}
Button5.Enabled = true;
Button3.Enabled = false;
strFFOUT = ffReader.ReadLine();
//Show each read line in the richtextbox
RichTextBox1.Text = strFFOUT;
if (strFFOUT != null)
{
if (strFFOUT.Contains("frame="))
{
currentFramestr = strFFOUT.Substring(7, 6).Trim();
Regex rx = new Regex(@"^\d+");
Match m = rx.Match(currentFramestr);
if (m.Success)
{
currentFrameInt = System.Convert.ToInt32(m.Value);
}
}
}
string percentage = System.Convert.ToInt32((ProgressBar1.Value / ProgressBar1.Maximum * 100)).ToString() + "%";
ProgressBar1.Maximum = FCount + 1000;
ProgressBar1.Value = (currentFrameInt);
Label12.Text = "Current Encoded Frame: " + currentFrameInt;
Label11.Text = percentage;
} while (!(prcFFMPEG.HasExited || string.IsNullOrEmpty(strFFOUT)));
}
然后是backgroundworker dowork事件:
private void Bgw1_DoWork(object sender, DoWorkEventArgs e)
{
Convert();
}
我没有使用backgroundworker progresschanged事件和已完成的事件。 刚刚在已完成的事件中使用了一个断点,并看到它最终到达那里。
现在我在Convert方法中使用了一个断点。我在线上添加了一个断点:
if (m.Success)
{
currentFrameInt = System.Convert.ToInt32(m.Value);
}
第一次m.Value中的值为“9” 然后是“17”
它完成停止到“17”完成的事件 现在我根本没有使用断点。
第一个值是“9”到最后它是281我可以看到它接近结束它从269跳到281.
这是使用断点完成流程时form1的屏幕截图:
当前编码帧:17表示Label12
NumberOfFrames:280 thats Label14
progressBar1右边的0%永远不会改变并始终保持0%是Label11
这是form1的屏幕截图,没有使用任何断点:
在form1的顶部:
private Process prcFFMPEG;
private ProcessStartInfo psiProcInfo;
private string strFFCMD;
private StreamReader ffReader;
private string strFFOUT;
private string currentFramestr;
private int currentFrameInt;
答案 0 :(得分:1)
label12 = ProgressBar1.Maximum = FCount + 10 = Framecount + 10 = 280 + 10 = 290
label12
获得ffReader = prcFFMPEG.StandardError;
的价值。如果不了解这个过程prcFFMPEG
,很难说出来。但我想它最后会返回错误值frame=281
。但是,您的Trim
或RegEx
。ProgressBar1
值转换为double
:
label11 = percentage = ... = ((double)ProgressBar1.Value / (double)ProgressBar1.Maximum * 100.0)