一.Listener.h中部分方法声明如下:
class Listener {
public:
Listener(Poco::UInt32 id,Publication& publication,FlowWriter& writer,bool unbuffered);
virtual ~Listener();
void pushAudioPacket(Poco::UInt32 time,PacketReader& packet);
void pushVideoPacket(Poco::UInt32 time,PacketReader& packet);
void pushDataPacket(const std::string& name,PacketReader& packet);
};
说明:这其中有些方法的参数为PacketReader的引用,然后在调用该方法之前,通常要通过new PacketReader实例化,如
在AMFReaderCreator类中就会有这样的方法:
Cumulus::PacketReader* AMFReaderCreator::getPacketReader() {
Cumulus::PacketReader* pReader = new Cumulus::PacketReader(reinterpret_cast<const Poco::UInt8*>(amf.data()), amf.size());
pReader->reset(13 + _name.size());
return pReader;
}
这样,在DownstreamHandler中每接收一个报文就会new一个对象.
二.Listener.cpp中部分方法的实现如下:
void Listener::pushDataPacket(const string& name,PacketReader& packet) {
if(_unbuffered) {
UInt16 offset = name.size()+9;
if(packet.position()>=offset) {
packet.reset(packet.position()-offset);
_writer.writeUnbufferedMessage(packet.current(),packet.available());
return;
}
}
}
说明:细致观察该函数的实现,完全可以简单地替换如下:
void Listener::pushPacketData(const std::string& name,std::string& amf){
if(_unbuffered){
const unsigned char* amfData = reinterpret_cast<const Poco::UInt8*>(amf.data());
amfData = amfData + 4;
_writer.writeUnbufferedMessage(reinterpret_cast<const UInt8*>(amfData),amf.size()-4);
return;
}
}
三.由此,在DownstreamHandler中的调用就由原来的
Cumulus::PacketReader* pReader = amfReaderCreator.getPacketReader();
it->second->pushDataPacket(RPCMessage::HANDLE_VOICE_RES, *pReader);
it->second->flush();
delete pReader;
改为简单的返回amf字符串即可,如下:
it->second->pushPacketData(RPCMessage::HANDLE_VIDEO_RES,amfReaderCreator.getAmfString());
it->second->flush();
其中amfReaderCreator.getAmfString()的实现为
std::string& AMFReaderCreator::getAmfString(){
return amf;
}
说明:amf即为一开始设置的amf3格式的字符串,比如:
AMFReaderCreator::AMFReaderCreator(const std::string& name, Poco::UInt16 timestamp)
: _name(name) {//Poco::UInt32 timestamp) {
char header[11] = {
'U', 'S', 'T', 'C',
0x0F, 0x00, 0x00, 0x00,
static_cast<char>(timestamp & 0xFF00 >> 8),
static_cast<char>(timestamp & 0x00FF)};
amf.append(header, 10);
writeString(name);
}
转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8651230