继承 RtpFeedback
#ifndef CHANNEL_RTPFEEDBACKIMPL_H
#define CHANNEL_RTPFEEDBACKIMPL_H
#include "rtp_rtcp_defines.h"
#include "xx\defines.h"
using namespace webrtc ;
class RtpFeedbackImpl : public RtpFeedback
{
public:
RtpFeedbackImpl (NET_ADAPTER_TYPE net_adapter_type) ;
~RtpFeedbackImpl () ;
//only this func is used to deal with dead or alive status
void OnPeriodicDeadOrAlive(const WebRtc_Word32 id,
const RTPAliveType alive) ;
public:
//imp RtpFeedback
WebRtc_Word32 OnInitializeDecoder(
const WebRtc_Word32 id,
const WebRtc_Word8 payloadType,
const char payloadName[RTP_PAYLOAD_NAME_SIZE],
const int frequency,
const WebRtc_UWord8 channels,
const WebRtc_UWord32 rate)
{
return 0 ;
}
void OnPacketTimeout(const WebRtc_Word32 id) {} ;
void OnReceivedPacket(const WebRtc_Word32 id,
const RtpRtcpPacketType packetType) {} ;
void OnIncomingSSRCChanged( const WebRtc_Word32 id,
const WebRtc_UWord32 SSRC) {} ;
void OnIncomingCSRCChanged( const WebRtc_Word32 id,
const WebRtc_UWord32 CSRC,
const bool added) {} ;
private :
NET_ADAPTER_TYPE m_net_adapter_type ;
};
#endif
#include "stdafx.h"
#include "RtpFeedbackImpl.h"
#include "xx\INetAdapterManager.h"
#include <iostream>
#include <inaddr.h>
RtpFeedbackImpl::RtpFeedbackImpl (NET_ADAPTER_TYPE net_adapter_type)
: m_net_adapter_type (net_adapter_type)
{
}
RtpFeedbackImpl::~RtpFeedbackImpl (void)
{
}
void RtpFeedbackImpl::OnPeriodicDeadOrAlive(const WebRtc_Word32 id,
const RTPAliveType alive)
{
if (alive == kRtpDead) //断线重连 (重建Socket)
{
sockaddr_in svraddr ;
//重新进行connect
}
else
{
//..
}
}
//使用
增加断线重连机制需要对RtpRtcp调用以下方法
m_pRtpRtcp->SetPeriodicDeadOrAliveStatus (true, N) ; //开启断线检测,周期N秒
m_pRtpRtcp->RegisterIncomingRTPCallback (new RtpFeedbackImpl(type)) ;
CPTSChatAVChannelBase::Initialize(strAddr, uPort, uRoomID,uUserID);
if(m_pRtpRtcp)
RtpRtcp::DestroyRtpRtcp(m_pRtpRtcp);
m_pRtpRtcp = RtpRtcp::CreateRtpRtcp(0,true);
m_pRtpRtcp->InitReceiver();
m_pRtpRtcp->InitSender();
m_pRtpRtcp->RegisterRtcpObservers(0,&m_BwObserver,0);
m_pRtpRtcp->RegisterSendTransport(&m_Transport);
m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,kRtpExtensionTransmissionTimeOffsetId);
m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphSidCmd,kRtpExtensionEphSidCmdId);
m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphRoomidVer,kRtpExtensionEphRoomidVerId);
m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphCheckCode,kRtpExtensionEphCheckCodeId);
m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphSrcKey,kRtpExtensionEphSrcKeyId);
m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphFrameidOffset,kRtpExtensionEphFrameidOffsetId);
m_pRtpRtcp->RegisterSendRtpHeaderExtension(kRtpExtensionEphPacketidTotalsize,kRtpExtensionEphPacketidTotalsizeId);
m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,kRtpExtensionTransmissionTimeOffsetId);
m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphSidCmd,kRtpExtensionEphSidCmdId);
m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphRoomidVer,kRtpExtensionEphRoomidVerId);
m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphCheckCode,kRtpExtensionEphCheckCodeId);
m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphSrcKey,kRtpExtensionEphSrcKeyId);
m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphFrameidOffset,kRtpExtensionEphFrameidOffsetId);
m_pRtpRtcp->RegisterReceiveRtpHeaderExtension(kRtpExtensionEphPacketidTotalsize,kRtpExtensionEphPacketidTotalsizeId);
m_pRtpRtcp->SetCSRCStatus(false);
m_pRtpRtcp->SetSendingStatus(false);
m_pRtpRtcp->SetRTCPStatus(kRtcpCompound);
m_pRtpRtcp->SetNACKStatus(kNackRtcp);
m_pRtpRtcp->SetTransmissionSmoothingStatus(true);
m_pRtpRtcp->SetTargetSendBitrate(600000);//for test
m_pRtpRtcp->SetStorePacketsStatus(true,CACHE_PACKET_COUNT);
m_pRtpRtcp->SetSSRC(uUserID);
m_pRtpRtcp->SetStartTimestamp(0);
m_pRtpRtcp->SetPeriodicDeadOrAliveStatus (true, OFFLINE_RECONNECT_INTERVAL) ; //开启断线检测,周期(OFFLINE_RECONNECT_INTERVAL)秒
m_pRtpRtcp->RegisterIncomingRTPCallback (new RtpFeedbackImpl(ADAPTER_TYPE_AUDIO)) ;//断线处理回调过程