2011-10-24 34 views
0

實際上,我已經能夠生成時間戳,並且可以使用一些過濾器(複用器),但由於我想能夠使用GDCL MP4 Multiplexer Filter,我想討論一下計算採樣時間值的方法。如何在RTSP源過濾器中生成樣本時間戳?

奇怪的是,如果我把Smart Tee Filter放在我的RTSP Source FilterGDCL MP4 Multiplexer Filter之間,一切似乎都有效。我能夠正確捕捉視頻流。但沒有Smart Tee Filter,我仍然能夠捕捉視頻,但這次與定期毛刺。據我所知,Smart Tee Filter除了提供雙輸出引腳,一個帶有時間戳(捕獲引腳)和一個沒有時間戳(預覽引腳)並且兩個引腳共享相同的流緩衝區之外,沒有多大作用。所以,我想到的東西是不知何故Smart Tee Filter重組像時間戳的東西。但是如果我不生成時間戳,Smart Tee Filter也不會生成這些值。我目前的猜測是,我正確計算了幀的開始時間,但是幀的停止時間不正確,並且Smart Tee Filter正在重新計算幀停止時間(這只是當然的猜測)。

我用來計算開始和停止時間,如下面的公式。

startTime = now 
timeDelta = now - previousFrame 
endTime = startTime + timeDelta 

這不是確切的公式,但它是接近的東西。結果如下。

Media Time/Time: 0-1 0-0 
Media Time/Time: 1-2 500028-1000056 
Media Time/Time: 2-3 930053-1360078 
Media Time/Time: 3-4 1610092-2290131 
Media Time/Time: 4-5 2200126-2790160 
Media Time/Time: 5-6 2900166-3600206 
Media Time/Time: 6-7 3500200-4100234 
Media Time/Time: 7-8 4240242-4980284 
Media Time/Time: 8-9 4720270-5200298 
Media Time/Time: 9-10 5350306-5980342 
Media Time/Time: 10-11 5980342-6610378 
Media Time/Time: 11-12 6610378-7240414 
Media Time/Time: 12-13 7250414-7890450 
Media Time/Time: 13-14 7880450-8510486 
Media Time/Time: 14-15 8510486-9140522 
Media Time/Time: 15-16 9140522-9770558 
Media Time/Time: 16-17 9780559-10420596 
Media Time/Time: 17-18 10410595-11040631 
Media Time/Time: 18-19 11040631-11670667 
Media Time/Time: 19-20 11680668-12320705 
Media Time/Time: 20-21 12310704-12940740 
Media Time/Time: 21-22 12940740-13570776 
Media Time/Time: 22-23 13600778-14260816 
Media Time/Time: 23-24 14220813-14840848 
Media Time/Time: 24-25 14840849-15460885 
Media Time/Time: 25-26 15480885-16120921 
Media Time/Time: 26-27 16110921-16740957 
Media Time/Time: 27-28 16740957-17370993 
Media Time/Time: 28-29 17380994-18021031 
Media Time/Time: 29-30 18011030-18641066 
Media Time/Time: 30-31 18631065-19251100 

這些都是媒體的時間和由SetMediaTime()和SETTIME()方法來設置時間值(無論是在啓停格式)。我看到的問題是一些開始/結束時間在連續幀中重疊。當然這是由抖動因素等引起的。如果我根據前一幀計算時間增量,並且如果下一幀比預期更早到達,則會發生重疊。所以,我在代碼中做了一些改動。我的最終代碼如下所示。

 _FILETIME fileTime; 
     GetSystemTimeAsFileTime(&fileTime); 
     now = ((((__int64)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime) - streamReader->rtpProtocolHandler->m_iReferenceTime); 
     timeDelta = now - m_iFrameTimePrevious; 
     m_iFrameTime = max(now, m_iFrameTime); 
     m_iFrameTimePrevious = m_iFrameTime; 
     REFERENCE_TIME rtStart = m_iFrameTime; 
     REFERENCE_TIME rtStop; 
     if(timeDelta > 0) { 
      m_iFrameTime += timeDelta; 
      rtStop = m_iFrameTime; 
     } else { 
      rtStop = rtStart; 
     } 
     pSample->SetTime(&rtStart, &rtStop); 
     pSample->SetMediaTime(&m_iMediaTime, &(++m_iMediaTime)); 

和結果是這樣的:

Media Time/Time: 0-1 0-0 
Media Time/Time: 1-2 470027-940054 
Media Time/Time: 2-3 940054-1380079 
Media Time/Time: 3-4 1580091-2220128 
Media Time/Time: 4-5 2220128-2810161 
Media Time/Time: 5-6 2870164-3520200 
Media Time/Time: 6-7 3520200-4110234 
Media Time/Time: 7-8 4170239-4820278 
Media Time/Time: 8-9 4820278-5420312 
Media Time/Time: 9-10 5470313-6120348 
Media Time/Time: 10-11 6120348-6720382 
Media Time/Time: 11-12 6770387-7420426 
Media Time/Time: 12-13 7420426-8060463 
Media Time/Time: 13-14 8060463-8630494 
Media Time/Time: 14-15 8630494-9140521 
Media Time/Time: 15-16 9260530-9890566 
Media Time/Time: 16-17 9890566-10490600 
Media Time/Time: 17-18 10560604-11230642 
Media Time/Time: 18-19 11230642-11840677 
Media Time/Time: 19-20 11860679-12490716 
Media Time/Time: 20-21 12490716-13090750 
Media Time/Time: 21-22 13170754-13850792 
Media Time/Time: 22-23 13850792-14450826 
Media Time/Time: 23-24 14460827-15070862 
Media Time/Time: 24-25 15070862-15680897 
Media Time/Time: 25-26 15760902-16450942 
Media Time/Time: 26-27 16450942-17060977 
Media Time/Time: 27-28 17100978-17751014 
Media Time/Time: 28-29 17751014-18171038 
Media Time/Time: 29-30 18171040-18591066 
Media Time/Time: 30-31 18771074-19371108 

沒有重疊,但這次所有的故障仍然存在。我究竟做錯了什麼?

請記住,我的源過濾器可以與其他mp4複用器配合使用,如果我將Smart Tee過濾器放在中間位置,它也可以與GDCL MP4複用器配合使用。

回答

0

問題不是由時間戳造成的,而是某種緩衝損壞造成的。 Smart Tee過濾器通過丟棄無效幀或提供在我的源過濾器中丟失的幀隊列來解決問題。當我用適當的隊列機制改變我的馬車共享緩衝區時,一切都開始正常工作。

感謝Geraint Davies對他的大力支持和解決我的問題的調試工具。

1

當使用RTSP/RTP/RTCP時,我建議使用RTP時間戳進行採樣顯示時間(偏移量爲零)。

你怎麼能確定每個幀都是恰好是的持續時間相同? 根據我的經驗,這從來就不是這種情況,無論是使用實時來源還是基於文件的媒體。您的用例可能會有所不同。

此外,通過計算時間戳,您無法同步多個RTP流(例如音頻和視頻)。這是擁有RTCP發件人報告的原因之一。