让EasyDarwin只支持RTP over TCP传输

我们经常需要EasyDarwin服务器支持公网流媒体传输,但很多时候,播放器默认都是通过RTP over UDP的形式在RTSP SETUP中请求,往往都以在内网接收不到UDP数据失败结束,那么我们如何使EasyDarwin将客户端的RTP over UDP自动切换成RTP over TCP形式呢,如下方法亲测可用:

在EasyDarwin的RTSPSession::SetupRequest()方法中插入以下代码:

    //

    // If we don't have an RTP session yet, create one...

    if (fRTPSession == NULL)

    {

        theErr = this->CreateNewRTPSession(theMap);

        if (theErr != QTSS_NoErr)

            return;

    }
//查看是否为RTP Over TCP

    if (fRequest->GetMethod() == qtssSetupMethod)

    {

if(fRequest->GetTransportType() != qtssRTPTransportTypeTCP)

{

            (void)QTSSModuleUtils::SendErrorResponse(fRequest, qtssClientUnsupportedTransport, 0);

            return;

}

    }

    OSMutexLocker locker(fRTPSession->GetMutex());

    UInt32 headerBits = fRequest->GetBandwidthHeaderBits();

    if (headerBits != 0)

        (void)fRTPSession->SetValue(qtssCliSessLastRTSPBandwidth, 0,&headerBits,sizeof(headerBits), QTSSDictionary::kDontObeyReadOnly );

这样,在客户端发送SETUP的时候,服务器检查是否为RTP over TCP模式,如果不是,返回461 qtssClientUnsupportedTransport,标准客户端,如VLC、ffplay都支持此返回码!

同时,还有一个地方需要修改,保证EasyDarwin返回461后,不会把当前连接断开,代码在QTSSModuleUtils::SendErrorResponse中加入如下:

QTSS_Error  QTSSModuleUtils::SendErrorResponse( QTSS_RTSPRequestObject inRequest,

                                                        QTSS_RTSPStatusCode inStatusCode,

                                                        QTSS_AttributeID inTextMessage,

                                                        StrPtrLen* inStringArg)

{

    static Bool16 sFalse = false;

    //set RTSP headers necessary for this error response message

    (void)QTSS_SetValue(inRequest, qtssRTSPReqStatusCode, 0, &inStatusCode, sizeof(inStatusCode));

if(inStatusCode != qtssClientUnsupportedTransport)

(void)QTSS_SetValue(inRequest, qtssRTSPReqRespKeepAlive, 0, &sFalse, sizeof(sFalse));

    StringFormatter theErrorMsgFormatter(NULL, 0);

    char *messageBuffPtr = NULL;

 

------------------------------------------------------------
本文转自www.easydarwin.org,更多开源流媒体解决方案,请关注我们的微信:EasyDarwin 
posted @   Babosa|EasyDarwin  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
历史上的今天:
2014-01-10 VLC RTP Over TCP
2014-01-10 VLC RTP Over TCP
点击右上角即可分享
微信分享提示