我们经常需要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 

让EasyDarwin只支持RTP over TCP传输的更多相关文章

  1. Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)

    一.实现功能 1.服务器端选择待发送的文件,可以是多个 2.开启服务器,支持多客户端接入,能够实时显示每个客户端接入状态 3.等待所有客户端都处于已连接状态时,依次发送文件集给每个客户端,显示每个客户 ...

  2. TCP传输

    看过太多tcp相关文章,但是看完总是不过瘾,似懂非懂,反复考虑过后,我觉得是那些文章太过理论,看起来没有体感,所以吸收不了. 希望这篇文章能做到言简意赅,帮助大家透过案例来理解原理. tcp的特点 这 ...

  3. [webrtc] 强制使用tcp传输

    以前笔记,整理 webrtc默认使用UDP传输,但是也可以通过TCP传输. 使用tcp传输,需要服务器中转,turnserver,licode,janus之类的服务器. 1. 如果使用turnserv ...

  4. Java实验五报告——TCP传输及加解密

    一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...

  5. tcp传输黏包

    tcp传输黏包 tcpip协议使用"流式"(套接字)进行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你接收的时候就到达,特别是为了提高效率,充分利用带 ...

  6. TCP传输小数据包效率问题(译自MSDN)

    TCP传输小数据包效率问题(译自MSDN) http://www.ftpff.com/blog/?q=node/16 摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对T ...

  7. s6-7 TCP 传输策略

    TCP 传输策略 防止黏包现象的出现 当窗口数为 0 时,发送者不能正常发送数据段,除非: -Urgent数据.比如,用户想杀掉远端机器上的进程的时候,可以发送数据 -发送者可以发送一个字节的数据段, ...

  8. Android设备一对多录屏直播--(UDP组播连接,Tcp传输)

    原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...

  9. 一个RTSP/RTP over TCP 的丢包引起的问题

    背景知识:可以查看https://www.cnblogs.com/lidabo/p/4483497.html RTSP/RTP over TCP TCP承载RTSP/RTP   When you us ...

随机推荐

  1. net4:Panel动态添加控件及隐藏,Table动态创建表格

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  2. mybatis原理源码大牛连接

    mybatis讲解的非常好的连接: https://www.jianshu.com/nb/5226994 执行流程简介参考:http://www.cnblogs.com/dongying/p/4142 ...

  3. Atcoder CODE FESTIVAL 2017 qual B E - Popping Balls 组合计数

    题目链接 题意 \(A+B\)个球排成一行,左边\(A\)个为红球,右边\(B\)个为蓝球. 最开始可以选择两个数\(s,t\),每次操作可以取左起第\(1\)或\(s\)或\(t\)个球.问有多少种 ...

  4. Android系统默认语言改为中文

    第一种方法: 修改 build/tools/buildinfo.sh echo "ro.product.locale.language=zh"echo "ro.produ ...

  5. svn的简单知识

    svn的简单知识 一.简介: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统, 它的设计目标就是取代CVS.互联网上很多版本控制服务已从 ...

  6. react-native初始化项目的时候安装失败,如何解决【摘】

    首先初始化项目报错:  解决方法: 将这个版本号改为: 然后将这里: 改为:  版本号相对应 然后便可安装成功! [注:转载:https://blog.csdn.net/wwrzyy/article/ ...

  7. 牛客网 牛客练习赛7 D. 珂朵莉的无向图(多源BFS)

    题目链接  Problem D 比赛的时候完全想不到 直接对给定的这些点做多源$BFS$,把给定的这些点全都压到队列里,然后一个个做. 最后统计被访问的点的个数即可. #include <bit ...

  8. cmake使用(CMakeList.txt)

    set(CMAKE_INCLUDE_CURRENT_DIR ON)#CMAKE_INCLUDE_CURRENT_DIR equal to INCLUDE_DIRECTORY(${CMAKE_CURRE ...

  9. ros pub sub ("~")

    base_velocity_smoother.cpp                        remap ("~")    订阅: "cmd_vel"   ...

  10. JDK1.8日期时间库学习

    这周在阅读<阿里巴巴Java开发手册>时,在并发处理一节的日期处理中,其强调SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果 定义为 stati ...