热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设置rtprtsprtcp端口转载

1.设置RTSP端口号设置RTSP端口号的处理位于ARTSPConnection.cpp文件中,首先从url中获取端口号,如果读取不到,则

1.设置RTSP端口号

设置RTSP端口号的处理位于ARTSPConnection.cpp文件中,首先从url中获取端口号,如果读取不到,则设置为默认端口554。代码处理如下:

[cpp] view plaincopy
  1. ARTSPConnection::ParseURL(  
  2.   
  3.     const char *colonPos = strchr(host->c_str(), ':');  
  4.   
  5.     if (colonPos != NULL) {  
  6.         unsigned long x;  
  7.         if (!ParseSingleUnsignedLong(colonPos + 1, &x) || x >= 65536) { // rtsp端口必须小于65536  
  8.             return false;  
  9.         }  
  10.   
  11.         *port = x;  
  12.   
  13.         size_t colonOffset = colonPos - host->c_str();  
  14.         size_t trailing = host->size() - colonOffset;  
  15.         host->erase(colonOffset, trailing);  
  16.     } else {  
  17.         *port = 554; // 如果从url中获取不到端口,则设置默认端口554  
  18.     }  
--------------------------------------------------------------------------------------------------------

2.设置RTP和RTCP端口号

设置RTP和RTCP端口号的处理位于ARTPConnection.cpp文件中中,与设置RTSP端口号的处理分别在不同的文件中。

(1)函数声明:创建一对相邻端口的UDP数据报套接字。rtp套接字是偶数端口,rtcp套接字端口比rtp端口号大一个号。
[cpp] view plaincopy
  1. // Creates a pair of UDP datagram sockets bound to adjacent ports  
  2. // (the rtpSocket is bound to an even port, the rtcpSocket to the  
  3. // next higher port).  
  4. static void MakePortPair(  
  5.         int *rtpSocket, int *rtcpSocket, unsigned *rtpPort);  
(2)函数定义:具体设置RTP和RTCP端口
[cpp] view plaincopy
  1. // static  
  2. void ARTPConnection::MakePortPair(  
  3.         int *rtpSocket, int *rtcpSocket, unsigned *rtpPort) {  
  4.     *rtpSocket = socket(AF_INET, SOCK_DGRAM, 0);  
  5.     CHECK_GE(*rtpSocket, 0);  
  6.   
  7.     bumpSocketBufferSize(*rtpSocket);  
  8.   
  9.     *rtcpSocket = socket(AF_INET, SOCK_DGRAM, 0);  
  10.     CHECK_GE(*rtcpSocket, 0);  
  11.   
  12.     bumpSocketBufferSize(*rtcpSocket);  
  13.   
  14.     unsigned start = (rand() * 1000)/ RAND_MAX + 15550; // 最小端口号为15550  
  15.     start &= ~1; // 与1取反后的值做与操作,结果就是start变成偶数,端口从偶数开始  
  16.   
  17.     for (unsigned port &#61; start; port < 65536; port &#43;&#61; 2) { // rtp最大端口号为65535&#xff0c;此时rtcp端口号为65536  
  18.         struct sockaddr_in addr;  
  19.         memset(addr.sin_zero, 0, sizeof(addr.sin_zero));  
  20.         addr.sin_family &#61; AF_INET;  
  21.         addr.sin_addr.s_addr &#61; htonl(INADDR_ANY);  
  22.         addr.sin_port &#61; htons(port);  
  23.   
  24.         if (bind(*rtpSocket,  
  25.                  (const struct sockaddr *)&addr, sizeof(addr)) < 0) {  
  26.             continue;  
  27.         }  
  28.   
  29.         addr.sin_port &#61; htons(port &#43; 1);  
  30.   
  31.         if (bind(*rtcpSocket,  
  32.                  (const struct sockaddr *)&addr, sizeof(addr)) &#61;&#61; 0) {  
  33.             *rtpPort &#61; port;  
  34.             return; // 绑定rtcp端口后返回  
  35.         }  
  36.     }  
  37.   
  38.     TRESPASS();  
  39. }


推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
author-avatar
feify_fei512_478
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有