我如何修复代码,以便progressBar1显示从0%到100%的百分比?

时间:2016-06-09 16:35:28

标签: c# .net winforms

跳跃1步1%... 2%... 3%... 4%... 5% 现在发生的事情很少。首先,代码工作正常,后台工作者开始调用Convert方法,然后进入backgroundworker完成事件。不确定是否需要完成的事件。

你可以在button1点击事件中看到我第一次用帧数设置这个标签。和progressBar1最大值。

问题是:

  1. 在label12上,我看到290为progressBar1的最大值,但实际上只有280帧,在label14上显示有280帧数。

  2. 在这个过程的最后,我在label12上看到值281,但有280帧,为什么它计数到281?

  3. 标签上的百分比11根本没有移动,而是一直保持在0%。

  4. 在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的屏幕截图:

    Form1 with break point use

    当前编码帧:17表示Label12

    NumberOfFrames:280 thats Label14

    progressBar1右边的0%永远不会改变并始终保持0%是Label11

    这是form1的屏幕截图,没有使用任何断点:

    Form1 without using any break points

    在form1的顶部:

    private Process prcFFMPEG;
    private ProcessStartInfo psiProcInfo;
    private string strFFCMD;
    private StreamReader ffReader;
    private string strFFOUT;
    private string currentFramestr;
    private int currentFrameInt;
    

1 个答案:

答案 0 :(得分:1)

  1. 正如@Stephen Ross所说,你正在设置label12 = ProgressBar1.Maximum = FCount + 10 = Framecount + 10 = 280 + 10 = 290
  2. 您从label12获得ffReader = prcFFMPEG.StandardError;的价值。如果不了解这个过程prcFFMPEG,很难说出来。但我想它最后会返回错误值frame=281。但是,您的TrimRegEx
  3. 也可能出现问题
  4. 要解决问题3,您应该将ProgressBar1值转换为doublelabel11 = percentage = ... = ((double)ProgressBar1.Value / (double)ProgressBar1.Maximum * 100.0)