我正在为VLC开发一个转发器应用程序,遇到了以下问题:
转发器应该接收一个UDP流并将其转发到另一个中间件,然后该中间件将数据包放在一个时间触发的网络上。我的问题在于VLC发送的数据包不正常。目标网络以周期性的方式处理消息,一旦VLC开始快速地连续发送多个数据包(例如,在场景变化期间),它就会丢弃帧。我需要对这些突发数据强制执行一种零星的行为,这样它们就可以随心所欲地到达,但被转发的时间最少。
到目前为止,我的货运代理公司的工作如下:
我将整个工作放在一个QThread中,并将readyRead()信号连接到我的receivePacket()插槽,该槽通过调用第二个函数sendPacket()再次处理、处理和发送数据。
我的第一个(天真的)想法是,在每个QUdpSocket::writeDatagram调用之后,让线程睡眠保持100微秒,但这似乎是一种糟糕的方法,因为我将挂起整个线程,因此(我不确定)丢失了在此期间到达的VLC数据包。
我想到的另一个解决方案是创建一个单热点Qtimer,它将延迟writeDatagram()调用。但在这里,我不确定如果另一个数据包到达并再次触发receivePacket()时隙,从而覆盖我试图延迟发送的消息,会发生什么情况。
有什么简单的方法可以解决这个问题吗?我能想象的唯一可能的方法是向发送者引入一个内部缓冲区,但这听起来是一项很大的工作,而且由于我已经到了最后期限,我想避免这样做。
提前谢谢你!
发布于 2013-10-10 09:26:06
据我所知,sendPacket()方法被调用为fast/经常。这意味着您需要创建一个缓冲区,但这非常容易(如果在receivePacket和sendPacket的多个线程中运行,还需要在访问缓冲区之前/之后添加QMutex::lock()/unlock() )
在课堂上:
QTimer *timer; // Timer for periodically calling a sendPacket
QList<MyPacketClass*> buffer; // List containing the packets to be sent在Class.cpp构造器中,创建具有连接的定时器:
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(slotSendPacket()));
timer->start(1000); // Every second在receivePacket()中,只需将数据添加到列表中:
buffer.append(new MyPacketClass(data));在class.cpp中,从列表中创建连接和弹出数据的套接字:
void SomeClass::slotSendPacket()
{
if(buffer.size() > 0)
{
sendPacket(buffer.takeAt(0));
}
}在方法sendPacket(MyPacketClass* inData)中,释放分配的内存:
Do_whatever_needs_to_be_done_and_sent(); // Here is writeDatagram();
delete inData; // Free the memory for Packetclasshttps://stackoverflow.com/questions/19291447
复制相似问题