2016-02-24 88 views
0

請耐心等待,因爲我的問題可能難以解釋。重疊時的分裂時間跨度

我有多個TXT文件表示的時間跨度,以秒爲視頻選擇部分。例如,1.23-5.45。

我想用這些時間跨度採取的多個視頻這些部分,並創建一個視頻的所有部分。

我解析這些TXT文件到的鍵值對列表中的數組:

List<KeyValuePair<Double, Double>>[] TagsOfSeconds= new List<KeyValuePair<Double, Double>>[]() 

數組元素的每個索引代表一個TXT文件。每個元素都是一個KeyValue對列表,其中每個對都是秒時間跨度的開始結尾。

我的要求是解析這些TXT文件並將時間跨度分割爲5秒的片段(5是一個示例,片段值將由用戶提供),並將片段優先排列,以最小值(發生在其他段之前),如果兩者相等,則取第一個在TagsOfSeconds數組中的第一個。

下面是一個圖示。段順序就是我想要實現: enter image description here 我創建了下面的結構來跟蹤從文本文件解析的部分:

public struct PortionInfo 
    { 
     public Double Start, End; 
     public int VideoIndex, PortionIndex; 
     public Double PortionLength; 
    } 

這是基於我訂購的加載代碼段開始時間跨度和TXT文件索引:

private void OrderVideoPortions(List<KeyValuePair<Double, Double>>[] videoPortionslist) 
    { 
    videoPortionsOrder = new List<PortionInfo>(); //videoPortionsOrder.Sort() 
    for(int i=0;i< videoPortionslist.Length;i++) 
    { 
     for (int j = 0; j < videoPortionslist[i].Count; j++) 
     { 
      PortionInfo currentPortionInfo = new PortionInfo(); 
      currentPortionInfo.VideoIndex = i; 
      currentPortionInfo.PortionIndex = j; 
      currentPortionInfo.Start = videoPortionslist[i][j].Key; 
      currentPortionInfo.End = videoPortionslist[i][j].Value; 
      currentPortionInfo.PortionLength = currentPortionInfo.End - currentPortionInfo.Start; 
      videoPortionsOrder.Add(currentPortionInfo); 
     } 
    } 
    videoPortionsOrder.Sort(SortAscending); 
    } 



public static int SortAscending(PortionInfo p1, PortionInfo p2) 
    { 
    int returnVal = p1.Start.CompareTo(p2.Start); 
    if (returnVal == 0) 
    { 
     return p1.VideoIndex.CompareTo(p2.VideoIndex); 
    } 
    else 
     return returnVal; 
    } 

現在我必須從排序列表中生成段。

任何一個可以幫我實現這一目標?我只是想要確定交叉點和分段的幫助或指導。

感謝

+1

看起來你已經解決了這個問題 - 還有哪些工作要做? –

+0

我能夠從TXT文件的標籤進行排序,但我需要把它們分成更小的片段,並創建一個類似的東西是什麼如圖所示 – David

+0

你就不能每次都到最近的5S圓,然後創建每個運行(endTime - startTime)/ 5次的循環內的段? –

回答

0

我修改了PortionInfo結構具有構造和活動一個bool創建結構時自動設置爲true。

private void CreateFinalSegments(List<PortionInfo> orderedVideoPortions) 
     { 
     int segmentSize = int.Parse(_txtTimeSegments.Text); 
     int extrSegmentDuration = int.Parse(_txtExtraDurationAllowed.Text); 
     PortionInfo currentPortion = new PortionInfo(); 
     finalSegments = new List<PortionInfo>(); 
     if (_txtExtraDurationAllowed.Text == "0" || _txtTimeSegments.Text == "0") 
     { 
      return;//Check that still needs to be handled 
     } 
     else 
     { 
      for (int i=0;i< orderedVideoPortions.Count;i++) 
      { 
       if (orderedVideoPortions[i].Active) 
       { 
        if (orderedVideoPortions[i].PortionLength <= (segmentSize + extrSegmentDuration)) 
        { 
        finalSegments.Add(orderedVideoPortions[i]); 
        currentPortion = orderedVideoPortions[i]; 
        currentPortion.Active = false; 
        orderedVideoPortions[i]=currentPortion ; 
        } 
        else 
        { 
        currentPortion = orderedVideoPortions[i]; 
        finalSegments.Add(new PortionInfo(currentPortion.Start, currentPortion.Start+ segmentSize, currentPortion.VideoIndex, currentPortion.PortionIndex)); 
        currentPortion.Start += segmentSize; 
        currentPortion.PortionLength = currentPortion.End - currentPortion.Start; 
        orderedVideoPortions[i] = currentPortion; 
        orderedVideoPortions.Sort(SortAscending); 
        i = 0;//Note: Needs to be rechecked because --i should be enough. 
        } 
       } 
      } 
      Application.DoEvents(); 
      _lblStatus.Text = "Video segments generated. Now Working on generating final video"; 
     } 
     }