mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-26 04:31:37 +08:00
rtsp服务器支持发送rtcp包
This commit is contained in:
parent
dc67665784
commit
bceff73429
@ -111,6 +111,7 @@ class RtcpCounter {
|
|||||||
public:
|
public:
|
||||||
uint32_t pktCnt = 0;
|
uint32_t pktCnt = 0;
|
||||||
uint32_t octCount = 0;
|
uint32_t octCount = 0;
|
||||||
|
//网络字节序
|
||||||
uint32_t timeStamp = 0;
|
uint32_t timeStamp = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -976,44 +976,6 @@ inline bool RtspSession::findStream() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void RtspSession::sendRtpPacket(const RtpPacket::Ptr & pkt) {
|
|
||||||
//InfoL<<(int)pkt.Interleaved;
|
|
||||||
switch (_rtpType) {
|
|
||||||
case Rtsp::RTP_TCP: {
|
|
||||||
BufferRtp::Ptr buffer(new BufferRtp(pkt));
|
|
||||||
send(buffer);
|
|
||||||
#ifdef RTSP_SEND_RTCP
|
|
||||||
int iTrackIndex = getTrackIndexByTrackId(pkt.interleaved / 2);
|
|
||||||
RtcpCounter &counter = _aRtcpCnt[iTrackIndex];
|
|
||||||
counter.pktCnt += 1;
|
|
||||||
counter.octCount += (pkt.length - 12);
|
|
||||||
auto &_ticker = _aRtcpTicker[iTrackIndex];
|
|
||||||
if (_ticker.elapsedTime() > 5 * 1000) {
|
|
||||||
//send rtcp every 5 second
|
|
||||||
_ticker.resetTime();
|
|
||||||
counter.timeStamp = pkt.timeStamp;
|
|
||||||
sendRTCP();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Rtsp::RTP_UDP: {
|
|
||||||
int iTrackIndex = getTrackIndexByTrackType(pkt->type);
|
|
||||||
auto &pSock = _apRtpSock[iTrackIndex];
|
|
||||||
if (!pSock) {
|
|
||||||
shutdown();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BufferRtp::Ptr buffer(new BufferRtp(pkt,4));
|
|
||||||
_ui64TotalBytes += buffer->size();
|
|
||||||
pSock->send(buffer);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RtspSession::onRtpSorted(const RtpPacket::Ptr &rtppt, int trackidx) {
|
void RtspSession::onRtpSorted(const RtpPacket::Ptr &rtppt, int trackidx) {
|
||||||
_pushSrc->onWrite(rtppt, false);
|
_pushSrc->onWrite(rtppt, false);
|
||||||
}
|
}
|
||||||
@ -1202,63 +1164,108 @@ bool RtspSession::close() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void RtspSession::sendRtpPacket(const RtpPacket::Ptr & pkt) {
|
||||||
|
//InfoL<<(int)pkt.Interleaved;
|
||||||
|
switch (_rtpType) {
|
||||||
|
case Rtsp::RTP_TCP: {
|
||||||
|
BufferRtp::Ptr buffer(new BufferRtp(pkt));
|
||||||
|
send(buffer);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Rtsp::RTP_UDP: {
|
||||||
|
int iTrackIndex = getTrackIndexByTrackType(pkt->type);
|
||||||
|
auto &pSock = _apRtpSock[iTrackIndex];
|
||||||
|
if (!pSock) {
|
||||||
|
shutdown();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BufferRtp::Ptr buffer(new BufferRtp(pkt,4));
|
||||||
|
_ui64TotalBytes += buffer->size();
|
||||||
|
pSock->send(buffer);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef RTSP_SEND_RTCP
|
#ifdef RTSP_SEND_RTCP
|
||||||
inline void RtspSession::sendRTCP() {
|
int iTrackIndex = getTrackIndexByInterleaved(pkt->interleaved);
|
||||||
//DebugL;
|
if(iTrackIndex == -1){
|
||||||
uint8_t aui8Rtcp[60] = {0};
|
return;
|
||||||
uint8_t *pui8Rtcp_SR = aui8Rtcp + 4, *pui8Rtcp_SDES = pui8Rtcp_SR + 28;
|
}
|
||||||
for (uint8_t i = 0; i < _uiTrackCnt; i++) {
|
RtcpCounter &counter = _aRtcpCnt[iTrackIndex];
|
||||||
auto &track = _aTrackInfo[i];
|
counter.pktCnt += 1;
|
||||||
auto &counter = _aRtcpCnt[i];
|
counter.octCount += (pkt->length - pkt->offset);
|
||||||
|
auto &ticker = _aRtcpTicker[iTrackIndex];
|
||||||
|
if (ticker.elapsedTime() > 5 * 1000) {
|
||||||
|
//send rtcp every 5 second
|
||||||
|
ticker.resetTime();
|
||||||
|
//直接保存网络字节序
|
||||||
|
memcpy(&counter.timeStamp, pkt->payload + 8 , 4);
|
||||||
|
sendSenderReport(_rtpType == Rtsp::RTP_TCP,iTrackIndex);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
aui8Rtcp[0] = '$';
|
#ifdef RTSP_SEND_RTCP
|
||||||
aui8Rtcp[1] = track.trackId * 2 + 1;
|
inline void RtspSession::sendSenderReport(bool overTcp,int iTrackIndex) {
|
||||||
aui8Rtcp[2] = 56 / 256;
|
uint8_t aui8Rtcp[4 + 28 + 10 + sizeof(SERVER_NAME) + 1] = {0};
|
||||||
aui8Rtcp[3] = 56 % 256;
|
uint8_t *pui8Rtcp_SR = aui8Rtcp + 4, *pui8Rtcp_SDES = pui8Rtcp_SR + 28;
|
||||||
|
auto &track = _aTrackInfo[iTrackIndex];
|
||||||
|
auto &counter = _aRtcpCnt[iTrackIndex];
|
||||||
|
|
||||||
pui8Rtcp_SR[0] = 0x80;
|
aui8Rtcp[0] = '$';
|
||||||
pui8Rtcp_SR[1] = 0xC8;
|
aui8Rtcp[1] = track->_interleaved + 1;
|
||||||
pui8Rtcp_SR[2] = 0x00;
|
aui8Rtcp[2] = (sizeof(aui8Rtcp) - 4) / 256;
|
||||||
pui8Rtcp_SR[3] = 0x06;
|
aui8Rtcp[3] = (sizeof(aui8Rtcp) - 4) % 256;
|
||||||
|
|
||||||
uint32_t ssrc=htonl(track.ssrc);
|
pui8Rtcp_SR[0] = 0x80;
|
||||||
memcpy(&pui8Rtcp_SR[4], &ssrc, 4);
|
pui8Rtcp_SR[1] = 0xC8;
|
||||||
|
pui8Rtcp_SR[2] = 0x00;
|
||||||
|
pui8Rtcp_SR[3] = 0x06;
|
||||||
|
|
||||||
uint64_t msw;
|
uint32_t ssrc=htonl(track->_ssrc);
|
||||||
uint64_t lsw;
|
memcpy(&pui8Rtcp_SR[4], &ssrc, 4);
|
||||||
struct timeval tv;
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
msw = tv.tv_sec + 0x83AA7E80; /* 0x83AA7E80 is the number of seconds from 1900 to 1970 */
|
|
||||||
lsw = (uint32_t) ((double) tv.tv_usec * (double) (((uint64_t) 1) << 32) * 1.0e-6);
|
|
||||||
|
|
||||||
msw = htonl(msw);
|
uint64_t msw;
|
||||||
memcpy(&pui8Rtcp_SR[8], &msw, 4);
|
uint64_t lsw;
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
msw = tv.tv_sec + 0x83AA7E80; /* 0x83AA7E80 is the number of seconds from 1900 to 1970 */
|
||||||
|
lsw = (uint32_t) ((double) tv.tv_usec * (double) (((uint64_t) 1) << 32) * 1.0e-6);
|
||||||
|
|
||||||
lsw = htonl(lsw);
|
msw = htonl(msw);
|
||||||
memcpy(&pui8Rtcp_SR[12], &lsw, 4);
|
memcpy(&pui8Rtcp_SR[8], &msw, 4);
|
||||||
|
|
||||||
uint32_t rtpStamp = htonl(counter.timeStamp);
|
lsw = htonl(lsw);
|
||||||
memcpy(&pui8Rtcp_SR[16], &rtpStamp, 4);
|
memcpy(&pui8Rtcp_SR[12], &lsw, 4);
|
||||||
|
//直接使用网络字节序
|
||||||
|
memcpy(&pui8Rtcp_SR[16], &counter.timeStamp, 4);
|
||||||
|
|
||||||
uint32_t pktCnt = htonl(counter.pktCnt);
|
uint32_t pktCnt = htonl(counter.pktCnt);
|
||||||
memcpy(&pui8Rtcp_SR[20], &pktCnt, 4);
|
memcpy(&pui8Rtcp_SR[20], &pktCnt, 4);
|
||||||
|
|
||||||
uint32_t octCount = htonl(counter.octCount);
|
uint32_t octCount = htonl(counter.octCount);
|
||||||
memcpy(&pui8Rtcp_SR[24], &octCount, 4);
|
memcpy(&pui8Rtcp_SR[24], &octCount, 4);
|
||||||
|
|
||||||
pui8Rtcp_SDES[0] = 0x81;
|
pui8Rtcp_SDES[0] = 0x81;
|
||||||
pui8Rtcp_SDES[1] = 0xCA;
|
pui8Rtcp_SDES[1] = 0xCA;
|
||||||
pui8Rtcp_SDES[2] = 0x00;
|
pui8Rtcp_SDES[2] = 0x00;
|
||||||
pui8Rtcp_SDES[3] = 0x06;
|
pui8Rtcp_SDES[3] = 0x06;
|
||||||
|
|
||||||
memcpy(&pui8Rtcp_SDES[4], &ssrc, 4);
|
memcpy(&pui8Rtcp_SDES[4], &ssrc, 4);
|
||||||
|
|
||||||
pui8Rtcp_SDES[8] = 0x01;
|
pui8Rtcp_SDES[8] = 0x01;
|
||||||
pui8Rtcp_SDES[9] = 0x0f;
|
pui8Rtcp_SDES[9] = 0x0f;
|
||||||
memcpy(&pui8Rtcp_SDES[10], "_ZL_RtspServer_", 15);
|
memcpy(&pui8Rtcp_SDES[10], SERVER_NAME, sizeof(SERVER_NAME));
|
||||||
pui8Rtcp_SDES[25] = 0x00;
|
pui8Rtcp_SDES[10 + sizeof(SERVER_NAME)] = 0x00;
|
||||||
send((char *) aui8Rtcp, 60);
|
|
||||||
}
|
if(overTcp){
|
||||||
|
send(obtainBuffer((char *) aui8Rtcp, sizeof(aui8Rtcp)));
|
||||||
|
}else {
|
||||||
|
_apRtcpSock[iTrackIndex]->send((char *) aui8Rtcp + 4, sizeof(aui8Rtcp) - 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace toolkit;
|
using namespace toolkit;
|
||||||
|
|
||||||
|
#define RTSP_SEND_RTCP
|
||||||
|
|
||||||
namespace mediakit {
|
namespace mediakit {
|
||||||
|
|
||||||
class RtspSession;
|
class RtspSession;
|
||||||
@ -201,7 +203,7 @@ private:
|
|||||||
#ifdef RTSP_SEND_RTCP
|
#ifdef RTSP_SEND_RTCP
|
||||||
RtcpCounter _aRtcpCnt[2]; //rtcp统计,trackid idx 为数组下标
|
RtcpCounter _aRtcpCnt[2]; //rtcp统计,trackid idx 为数组下标
|
||||||
Ticker _aRtcpTicker[2]; //rtcp发送时间,trackid idx 为数组下标
|
Ticker _aRtcpTicker[2]; //rtcp发送时间,trackid idx 为数组下标
|
||||||
inline void sendRTCP();
|
inline void sendSenderReport(bool overTcp,int iTrackIndex);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user