mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
优化rtmp发送,减少内存拷贝以及开辟
This commit is contained in:
parent
ce3c4c0d69
commit
dc1cae2153
@ -221,41 +221,55 @@ void RtmpProtocol::sendRtmp(uint8_t ui8Type, uint32_t ui32StreamId,
|
|||||||
auto strErr = StrPrinter << "不支持发送该类型的块流 ID:" << iChunkId << endl;
|
auto strErr = StrPrinter << "不支持发送该类型的块流 ID:" << iChunkId << endl;
|
||||||
throw std::runtime_error(strErr);
|
throw std::runtime_error(strErr);
|
||||||
}
|
}
|
||||||
|
//是否有扩展时间戳
|
||||||
bool bExtStamp = ui32TimeStamp >= 0xFFFFFF;
|
bool bExtStamp = ui32TimeStamp >= 0xFFFFFF;
|
||||||
RtmpHeader header;
|
|
||||||
header.flags = (iChunkId & 0x3f) | (0 << 6);
|
|
||||||
header.typeId = ui8Type;
|
|
||||||
set_be24(header.timeStamp, bExtStamp ? 0xFFFFFF : ui32TimeStamp);
|
|
||||||
set_be24(header.bodySize, buf->size());
|
|
||||||
set_le32(header.streamId, ui32StreamId);
|
|
||||||
|
|
||||||
//估算rtmp包数据大小
|
//rtmp头
|
||||||
uint32_t totalSize = 0;
|
BufferRaw::Ptr bufferHeader = obtainBuffer();
|
||||||
onSendRawData(obtainBuffer((char *) &header, sizeof(header)));
|
bufferHeader->setCapacity(sizeof(RtmpHeader));
|
||||||
totalSize += sizeof(header);
|
bufferHeader->setSize(sizeof(RtmpHeader));
|
||||||
|
//对rtmp头赋值,如果使用整形赋值,在arm android上可能由于数据对齐导致总线错误的问题
|
||||||
|
RtmpHeader *header = (RtmpHeader*) bufferHeader->data();
|
||||||
|
header->flags = (iChunkId & 0x3f) | (0 << 6);
|
||||||
|
header->typeId = ui8Type;
|
||||||
|
set_be24(header->timeStamp, bExtStamp ? 0xFFFFFF : ui32TimeStamp);
|
||||||
|
set_be24(header->bodySize, buf->size());
|
||||||
|
set_le32(header->streamId, ui32StreamId);
|
||||||
|
//发送rtmp头
|
||||||
|
onSendRawData(bufferHeader);
|
||||||
|
|
||||||
char acExtStamp[4];
|
//扩展时间戳字段
|
||||||
|
BufferRaw::Ptr bufferExtStamp;
|
||||||
if (bExtStamp) {
|
if (bExtStamp) {
|
||||||
//扩展时间戳
|
//生成扩展时间戳
|
||||||
set_be32(acExtStamp, ui32TimeStamp);
|
bufferExtStamp = obtainBuffer();
|
||||||
}
|
bufferExtStamp->setCapacity(4);
|
||||||
size_t pos = 0;
|
bufferExtStamp->setSize(4);
|
||||||
while (pos < buf->size()) {
|
set_be32(bufferExtStamp->data(), ui32TimeStamp);
|
||||||
if (pos) {
|
}
|
||||||
uint8_t flags = (iChunkId & 0x3f) | (3 << 6);
|
|
||||||
onSendRawData(obtainBuffer((char *) &flags, 1));
|
//生成一个字节的flag,标明是什么chunkId
|
||||||
|
BufferRaw::Ptr bufferFlags = obtainBuffer();
|
||||||
|
bufferFlags->setCapacity(1);
|
||||||
|
bufferFlags->setSize(1);
|
||||||
|
bufferFlags->data()[0] = (iChunkId & 0x3f) | (3 << 6);
|
||||||
|
|
||||||
|
size_t offset = 0;
|
||||||
|
uint32_t totalSize = sizeof(RtmpHeader);
|
||||||
|
while (offset < buf->size()) {
|
||||||
|
if (offset) {
|
||||||
|
onSendRawData(bufferFlags);
|
||||||
totalSize += 1;
|
totalSize += 1;
|
||||||
}
|
}
|
||||||
if (bExtStamp) {
|
if (bExtStamp) {
|
||||||
//扩展时间戳
|
//扩展时间戳
|
||||||
onSendRawData(obtainBuffer(acExtStamp, 4));
|
onSendRawData(bufferExtStamp);
|
||||||
totalSize += 4;
|
totalSize += 4;
|
||||||
}
|
}
|
||||||
size_t chunk = min(_iChunkLenOut, buf->size() - pos);
|
size_t chunk = min(_iChunkLenOut, buf->size() - offset);
|
||||||
onSendRawData(std::make_shared<BufferPartial>(buf,pos,chunk));
|
onSendRawData(std::make_shared<BufferPartial>(buf,offset,chunk));
|
||||||
totalSize += chunk;
|
totalSize += chunk;
|
||||||
pos += chunk;
|
offset += chunk;
|
||||||
}
|
}
|
||||||
_ui32ByteSent += totalSize;
|
_ui32ByteSent += totalSize;
|
||||||
if (_ui32WinSize > 0 && _ui32ByteSent - _ui32LastSent >= _ui32WinSize) {
|
if (_ui32WinSize > 0 && _ui32ByteSent - _ui32LastSent >= _ui32WinSize) {
|
||||||
|
Loading…
Reference in New Issue
Block a user