1. 程式人生 > >視訊主觀實驗中一個簡易的視訊測試介面(C# Winfrom實現)

視訊主觀實驗中一個簡易的視訊測試介面(C# Winfrom實現)

在做針對視訊的主觀質量測試時,需要讓受試者通過測試介面進行觀看與打分。因此做了一個簡易的測試介面,採集使用者的資訊和打分情況,並匯入SQL資料庫,方便進一步的處理。測試流程分為7步,即圖中對應的7個序號,本篇部落格將對各部分的邏輯和程式碼進行梳理,整體難度不大,由於時間緊迫很多功能不完善。總體步驟如下:
  1. 輸入個人資訊
  2. 選取測試視訊新增到3中的Listbox中,若不需要隨機打亂序列順序,則跳過步驟3,直接播放
  3. 對視訊資訊進行隨機打亂,保證實驗隨機性,並進行播放
  4. 視訊播放完畢,進行主觀打分
  5. 打分完成後,點選”確認打分“儲存對應視訊資訊、打分情況,並自動播放下一個,當視訊播放結束時,隱藏”確認打分“按鈕。若要修改之前已打過分的視訊,雙擊6中對應的視訊,重新打分後點擊”確認修改“
  6. 儲存個人資訊、視訊資訊和打分資訊
  7. 匯出到資料庫或Excel
接下來進行程式碼分析。

1.個人資訊的輸入

個人資訊部分通過4個Label標籤,3個Textbox文字框以及一個確定Button實現,通過管理確定Button的指令碼實現個人資訊的匯入,程式碼如下
    private void button6_Click(object sender, EventArgs e)
        {
             dataGridView1.Rows.Add(" ", " ", " ", textBox2.Text, textBox3.Text, textBox4.Text);    //新增到6中的dataGridView1,前三列儲存視訊序號、名稱和打分資訊,便於資料庫讀取
            label6.Visible = false;    //輸入資訊後,1中所有元件可見性設定為false
            label7.Visible = false;
            label8.Visible = false;
            label9.Visible = false;
            textBox2.Visible = false;
            textBox3.Visible = false;
            textBox4.Visible = false;
            button6.Visible = false;
            MessageBox.Show("輸入成功!");
        }
輸入資訊後,點選確定按鈕後,匯入6中的Excel表格。

2.新增並播放

在button1中輸入如下程式碼(需要改進
 private void button1_Click(object sender, EventArgs e)
        {
            string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            listBox1.Items.Clear();
            listBox1.Items.Add(@str + "TimeTest\\timetest1\\video_1.mp4");    //新增
            listBox1.Items.Add(@str + "TimeTest\\timetest1\\video_2.mp4");
            listBox1.Items.Add(@str + "TimeTest\\timetest1\\video_3.mp4");
            listBox1.Items.Add(@str + "TimeTest\\timetest1\\video_4.mp4");
           // button7.PerformClick(); //隨機打亂控制開關
            axWindowsMediaPlayer1.Ctlcontrols.play();
            button2.PerformClick();    //播放按鈕
           
        }
        private void button2_Click(object sender, EventArgs e)    //button2按鈕,控制播放
        {
            listBox1.SelectedIndex = 0;    //從第一個開始播放
            axWindowsMediaPlayer1.URL = listBox1.SelectedItem.ToString();    
        }

3.Listbox資訊的隨機打亂

進行隨機打亂可以保證測試的隨機性。隨機打亂按鈕的指令碼如下
  private void button7_Click(object sender, EventArgs e)
        {
            List<string> temp1 = new List<string>();   //兩個List用作儲存,List1進行讀取,隨機打亂後賦值給List2
            List<string> temp2 = new List<string>();
            foreach (var item in this.listBox1.Items)
            {
                temp1.Add(item.ToString());
            }
            int total = listBox1.Items.Count; //控制打亂的檔案數量
            int[] hashtable = new int[total];
            int[] output = new int[total];
            Random random = new Random();
            for (int i = 0; i < total; i++)    //隨機排序
            {
                int num = random.Next(0, total);
                while (hashtable[num] > 0)
                {
                    num = random.Next(0, total);
                }
                output[i] = num;    
                hashtable[num] = 1;
                temp2.Add(temp1[num]);
            }
            listBox1.Items.Clear();    //清空當前的Listbox
            foreach (string E in temp2)    //將temp2中的資料新增到Listbox中
            {
                listBox1.Items.Add(E);
            }
            //MessageBox.Show("序列已打亂!");
           
        }

4.打分控制元件

打分控制元件通過radioButton實現,並將所有radioButton放置在groupBox之中,防止使用者多選分數造成錯誤。每個radioButton的指令碼只用於讀取使用者的資訊程式碼如下
  private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
               textBox1.Text = radioButton1.Text;
            }
        }
如下圖所示,分數就新增到了紅框之中。

5.儲存打分結果

在確定打分情況後,點選“確認打分並播放下一個”可以儲存當前視訊資訊和打分情況,實現如下,
   private void button4_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedIndex < listBox1.Items.Count - 1)    //當前索引未到最後,則新增打分資訊
            {
                dataGridView1.Rows.Add((dataGridView1.Rows.Count - 1), listBox1.Items[listBox1.SelectedIndex].ToString(), textBox1.Text);
                ++listBox1.SelectedIndex;
                axWindowsMediaPlayer1.URL = listBox1.Items[listBox1.SelectedIndex].ToString();
            }
            else    //否則彈出finish介面
            {
                dataGridView1.Rows.Add((dataGridView1.Rows.Count - 1), listBox1.Items[listBox1.SelectedIndex].ToString(), textBox1.Text);
                MessageBox.Show("finish!");
            }
        }
此時修改打分按鍵預設時不顯示的。若要修改之前打分的結果,為資料表新增雙擊事件,程式碼如下
  private void dataGridView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            button4.Visible = false;    //隱藏“確認打分並播放下一個”
            button8.Visible = true;    //顯示“確認修改並返回當前”
            axWindowsMediaPlayer1.URL=dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[1].Value.ToString();    //雙擊資料表,讀取雙擊的行數,並播放該行索引為[1]的地址
        }
其中“確認修改並返回當前”程式碼如下
        private void button8_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[2].Value = textBox1.Text;    //修改資料表中當前行的分數
            button4.Visible = true;    //顯示“確認打分並播放下一個”
            button8.Visible = false;   //隱藏“確認修改並返回當前”
            listBox1.SelectedIndex = dataGridView1.Rows.Count - 2;    //通過當前資料表儲存的資訊返回之前播放的視訊
            axWindowsMediaPlayer1.URL = listBox1.Items[listBox1.SelectedIndex].ToString();
        }

6.資料表的儲存

用dataGridView儲存即可,新增幾個空列。

7.匯出到Excel/資料庫

一般分析、處理資料的話,用Excel即可,先給出匯出到Excel的方法
   private void button5_Click(object sender, EventArgs e)
        {
            string fileName = "";
            string saveFileName = "";
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.DefaultExt = "xls";
            saveDialog.Filter = "Excel檔案|*.xls";
            saveDialog.FileName = fileName;
            saveDialog.ShowDialog();
            saveFileName = saveDialog.FileName;
            if (saveFileName.IndexOf(":") < 0) return;
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            if (xlApp == null)
            {
                MessageBox.Show("無法建立Excel物件,您的電腦可能未安裝Excel");
                return;
            }
            Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
            Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
            for (int i = 0; i < dataGridView1.ColumnCount; i++)
            { worksheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText; }
            for (int r = 0; r < dataGridView1.Rows.Count; r++)
            {
                for (int i = 0; i < dataGridView1.ColumnCount; i++)
                {
                    worksheet.Cells[r + 2, i + 1] = dataGridView1.Rows[r].Cells[i].Value;
                }
                System.Windows.Forms.Application.DoEvents();
            }
            worksheet.Columns.EntireColumn.AutoFit();

            if (saveFileName != "")
            {
                try
                {
                    workbook.Saved = true;
                    workbook.SaveCopyAs(saveFileName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("匯出檔案時出錯,檔案可能正被開啟!\n" + ex.Message);
                }
            }
            xlApp.Quit();
            GC.Collect();//強行銷燬 
            dataGridView1.Rows.Clear();    //恢復初始狀態,方便下一位測試者
            label6.Visible = true;
            label7.Visible = true;
            label8.Visible = true;
            label9.Visible = true;
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox2.Visible = true;
            textBox3.Visible = true;
            textBox4.Visible = true;
            button6.Visible = true;
            MessageBox.Show("恭喜,完成測試!");
        }