gelen timestamping verileri Ben Video sunucusundan RTP veri almak veya işleyici onları itmek gerekiyordu özel DirectShow kaynak itme filtresi yazıyorum. Video sunucusundan RTP paketleri alan bir iş parçacığı için bir sarıcı olan CSourceStream ve CVideoReceiverThread sınıfından miras alan bir CVideoPushPin sınıfı yazdım. 256 eleman kuyruğuna, onlar hakkında tampon ve mağazalar bilgilere kopya onlarıYazma özel DirectShow RTSP/RTP Kaynak itme filtresi - canlı kaynaklardan
- çiğ RTP paketlerini alır ve Alıcı için gerekli olan bazı veriler
kareleri bir araya Raporları toplar: alıcı iplik esasen üç şey yapar tanımlanmış olan aşağıdaki gibidir:
struct queue_elem { char *start; // Pointer to a frame in a buffer int length; // Lenght of data REFERENCE_TIME recvTime; // Timestamp when the frame was received (stream time) }; struct data { struct queue_elem queue[QUEUE_LENGTH]; int qWrIdx; int qRdIdx; HANDLE mutex; };
her bir alınan çerçeve mevcut akış süresi ile timestamped edilir
p->StreamTime(refTime); REFERENCE_TIME rt = refTime.GetUnits();
Sorunlar, FillBuffer yöntemindeki her MediaSample için zaman damgalarını nasıl ayarlayacağımı bilmiyorum. Birkaç yol denedim, ancak oynatma ya duruyor ya da çok yavaş.
fark ettim Bu durumdaREFERENCE_TIME thisFrameStartTime, thisFrameEndTime;
// Make sure if there are at least 4 frames in the buffer
if(noOfFrames >= 4)
{
currentQe = m_myData.queue[m_myData.qRdIdx++]; //Take current frame description
if(m_myData.qRdIdx >= QUEUE_LENGTH)
{
m_myData.qRdIdx = 0;
}
nextQe = m_myData.queue[m_myData.qRdIdx]; //Take next frame description
if(currentQe.length > 0)
{
memcpy(pData, currentQe.start, currentQe.length);
pSample->SetActualDataLength(currentQe.length);
CRefTime refTime;
m_pFilter->StreamTime(refTime);
REFERENCE_TIME rt;
rt = refTime.GetUnits();
pSample->GetTime(&thisFrameStartTime, &thisFrameEndTime);
thisFrameEndTime = thisFrameStartTime + (nextQe.recvTime - currentQe.recvTime);
pSample->SetTime(&thisFrameStartTime, &thisFrameEndTime);
}
}
else
{
pSample->SetActualDataLength(0);
}
(FillBuffer yöntemi yeterince hızlı veri çekip olamaz nedense) çok hızlı kuyruk artar öğe sayısı ve sonuç şudur: Şu FillBuffer yöntemi şöyle video oynatırken gecikme artar. Canlı kaynaklardan veri alırken zaman damgasını nasıl yapmalıyım? Grafiğin akış süresi örnek nesnesinde damgası ulaştığında
Geraint, teşekkürler girişi için. biraz c yapılmış kodumda duruyor, ancak video çalıştırdıktan hemen sonra donuyor. Günlük dosyasında, FillBuffer yönteminin yalnızca iki kez çağrıldığını fark ettim.İlk kez çağrıldığında, akış süresi 3633950000, frameStartTime 3635700000 ve frameEndTime ise 3635703600'dür. İkinci kez akış zamanı 3634370000, frameStartTime 3635703600 ve frameEndTime ise 3635707200'dür. İlk karedeki zaman damgasına ulaşmak için akış zamanı ve daha sonra sorunsuz çalışır, ancak ne yazık ki olmaz. – mkurek