視訊主觀實驗中一個簡易的視訊測試介面(C# Winfrom實現)
阿新 • • 發佈:2019-02-13
在做針對視訊的主觀質量測試時,需要讓受試者通過測試介面進行觀看與打分。因此做了一個簡易的測試介面,採集使用者的資訊和打分情況,並匯入SQL資料庫,方便進一步的處理。測試流程分為7步,即圖中對應的7個序號,本篇部落格將對各部分的邏輯和程式碼進行梳理,整體難度不大,由於時間緊迫很多功能不完善。總體步驟如下:
- 輸入個人資訊
- 選取測試視訊新增到3中的Listbox中,若不需要隨機打亂序列順序,則跳過步驟3,直接播放
- 對視訊資訊進行隨機打亂,保證實驗隨機性,並進行播放
- 視訊播放完畢,進行主觀打分
- 打分完成後,點選”確認打分“儲存對應視訊資訊、打分情況,並自動播放下一個,當視訊播放結束時,隱藏”確認打分“按鈕。若要修改之前已打過分的視訊,雙擊6中對應的視訊,重新打分後點擊”確認修改“
- 儲存個人資訊、視訊資訊和打分資訊
- 匯出到資料庫或Excel
1.個人資訊的輸入
個人資訊部分通過4個Label標籤,3個Textbox文字框以及一個確定Button實現,通過管理確定Button的指令碼實現個人資訊的匯入,程式碼如下輸入資訊後,點選確定按鈕後,匯入6中的Excel表格。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("輸入成功!"); }
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("恭喜,完成測試!");
}