1.开源视频解决方案?
2.webrtc linphone å°åºåªä¸ª
3.音视频学习--Video Fast Update
4.野火鲁班猫卡片电脑创意氛围赛(第二期)基于鲁班猫1N的码视码多媒体会话服务器
5.wvp-GB28181-pro的安装与调试
6.怎样使用linphoneapi编程?
开源视频解决方案?
探索开源视频解决方案:Yangwebrtc、Licode、频源Janus与Mediasoup的码视码比较</ 在构建音视频系统时,开源技术无疑提供了快速而经济的频源途径,然而也伴随着技术债务的码视码可能。让我们深入剖析 Yangwebrtc、频源foobardts源码输出Licode、码视码Janus-gateway 和 Mediasoup 这四大开源解决方案,频源以帮助你做出明智的码视码选择。Yangwebrtc
自主研发的频源结晶:</Yangwebrtc 以其自定义的Webrtc/Srt/Rtmp架构而闻名,适用于教育、码视码医疗等多元化应用场景。频源它的码视码优点在于编译简单,适合中国本土生态,频源但谷歌Lib的码视码问题和复杂的编译过程可能成为挑战。Licode
全面的SFU/MCU平台:</Licode 不仅提供媒体通信和用户管理等基础功能,还支持分布式部署。其亮点在于无需二次开发,社区活跃。然而,Linux支持有限,代码结构复杂,Android/iOS SDK支持有限,性能方面略逊一筹。Janus-gateway
WebRTC服务器中的明星:</Janus以其C语言编写的WebRTC服务器而著名,尤其适合Linux环境。社区交流可能局限,但其源码清晰,部署指南详细,链接如下:/meetecho/janus-gateway,部署步骤详尽。 Janus的优势在于其插件式架构,支持SIP、TextRoom和Streaming等多种插件,传输层兼容多种协议,性能卓越。然而,复杂性高和异步I/O处理机制的局限性也需留意。Mediasoup
Mediasoup,97源码社区由Node.js和C++打造,专为WebRTC流媒体服务器设计。它关注底层数据传输,性能高效,WebRTC优化明显。与Janus相比,Mediasoup在实时性和效率上更胜一筹。其他选项
Medooze以其全面的功能而闻名,但C++开发的Mediasoup在性能上略优。Jitsi以其丰富的组件如Video-Bridge和活跃的社区吸引开发者,Kurento则凭借成熟的C++开发和详尽的文档吸引成熟项目。对于Go语言爱好者,pion/webrtc是个学习的好选择。决策建议
选择哪种方案,关键在于团队的技术熟悉度、项目需求、业务规模、分布式支持的考虑、二次开发的灵活性、时间限制以及社区的活跃度。务必在投入前进行彻底的测试和研究,确保选择最适合的开源视频解决方案。webrtc linphone å°åºåªä¸ª
ææ°è¦åä¸ä¸ªç§»å¨ç«¯è§é¢éè¯è½¯ä»¶ï¼å¤§è´çäºä¸ç°æçå¼æºè½¯ä»¶
ä¸) sipdroid
1ï¼æ¶æ
sipåè®®æ 使ç¨JAVAå®ç°ï¼é³é¢Codec使ç¨skypeçsilkï¼Silkç¼è§£ç æ¯Skypeå第ä¸æ¹å¼å人åå硬件å¶é åæä¾å çç¨è®¤è¯(RF)çSilk宽带é³é¢ç¼ç å¨ï¼å®ç°ãNATä¼ è¾æ¯æstun server.
2ï¼ä¼ç¼ºç¹ï¼
NATæ¹é¢åªæ¯æSTUNï¼æ ICEæ¡æ¶ï¼å¦éè¦å®å ¨å®ç°P2Pè§é¢éè¯éè¦å®ç°ç¬¦åICEæ åç客æ·ç«¯,é³é¢æ¹é¢æ²¡çå°AECçææ¯ï¼è§é¢æ¹é¢è¿ä¸æ¯å¤ªå®åï¼ç®ååªçå°è°ç¨çæ¯ç³»ç»èªå¸¦çMediaRecorderï¼å¹¶æ²¡æèªå·±ç第ä¸æ¹é³è§é¢ç¼è§£ç åºã
3ï¼å®é æµè¯ï¼
åºäºsipdroidæ¶æçè¯ï¼æ们è¦åçå·¥ä½ä¼æ¯è¾å¤ï¼ï¼ICEæ¯æï¼æ·»å åé³æ¶é¤ï¼NetEQçgipsé³é¢ææ¯ï¼æ·»å è§é¢ç¡¬ä»¶ç¼è§£ç codec.ï¼,æ以就ä¸åæµè¯äºã
äº) imsdroid
1)æ¶æï¼
åºäºdoubango(Doubango æ¯ä¸ä¸ªåºäº3GPP IMS/RCS 并è½ç¨äºåµå ¥å¼åæ¡é¢ç³»ç»çå¼æºæ¡æ¶ã该æ¡æ¶ä½¿ç¨ANSCI-Cç¼åï¼å ·æå¾å¥½çå¯ç§»æ¤æ§ã并ä¸å·²ç»è¢«è®¾è®¡æé常轻便ä¸è½ææçå·¥ä½å¨ä½å ååä½å¤çè½åçåµå ¥å¼ç³»ç»ä¸ãè¹æç³»ç»ä¸çidoubsåè½å°±æ¯åºäºæ¤æ¡æ¶ç¼å) .é³è§é¢ç¼ç æ ¼å¼å¤§é¨åé½æ¯æï¼H(video)ï¼VP8(video)ï¼iLBC(audio),PCMA,PCMU,G,Gï¼ãNATæ¯æICEï¼stun+turnï¼
2ï¼ææå®æµ
æµè¯ç¯å¢ï¼å ¬å¸å±åç½å 两å°æºå¨äºéï¼æå¡å¨èµ°å¤ç½sip2sip
é³é¢è´¨éå¯ä»¥ï¼ä½æ¯AECæå¼äºè¿æ¯æç¹åé³ï¼åºè¯¥å¯ä»¥ä¿®å¤ï¼ãè§é¢é©¬èµå æ¯è¾ä¸¥éï¼å»¶è¿1ç§å·¦å³ã
3ï¼ä¼ç¼ºç¹
imsdroidç®åæ¥è¯´è¿æ¯ç®æ¯è¾å ¨é¢çï¼å æ¬é³è§é¢ç¼è§£ç ï¼ä¼ è¾ï¼RTSPï¼ICEï¼ï¼é³é¢å¤çææ¯çé½ææ¶çãdoubango使ç¨äºwebrtcçAECææ¯ï¼ä½æ¯å ¶è°ç¨webrtcé¨å没æå¼æºï¼æ¯ç¨çç¼è¯åºæ¥çwebrtcçåºãå¦æè¦æ¹åé³é¢çè¯ä¸å¤ªæ¹ä¾¿ï¼Demoçé³é¢ææå¯ä»¥ï¼è§é¢ææè¿æ¯ä¸å¤ªçæ³ã
ä¸ï¼csipsimple
1ï¼sipåè®®æ ç¨çæ¯pjsip,é³è§é¢ç¼è§£ç ç¨å°ç第ä¸æ¹åºæffmpegï¼videoï¼,silk(audio),webrtc.é»è®¤ä½¿ç¨äºwebrtcçå声ç®æ³ãæ¯æICEåè®®ã
2ï¼ä¼ç¼ºç¹ï¼
csipsimpleæ¶ææ¯è¾æ¸ æ°ï¼sipåè®®ç±Cå®ç°ï¼javaéè¿JNIè°ç¨ï¼SIPåè®®è¿ä¸åä¼æ¯è¾é«æãå ¶VOIPå个åè½ä¹é½å ·å¤ï¼å æ¬NATä¼ è¾ï¼é³è§é¢ç¼è§£ç ã并ä¸è¯¥é¡¹ç®è·è¿æ°ææ¯æ¯è¾å¿«ï¼å®æ¹æ´»è·ç¨åº¦ä¹æ¯è¾é«ãå¦æåäºæ¬¡å¼åå¯ä»¥æ¨èè¿ä¸ªã
3ï¼å®æµææ
æµè¯ç¯å¢ï¼å ¬å¸å±åç½å 两å°æºå¨äºéï¼æå¡å¨èµ°å¤ç½sip2sip
é³é¢è´¨éå¯ä»¥ï¼æ ææ¾åé³ï¼è§é¢éè¦ä¸æ件ï¼é©¬èµå æ¯imsdroidæ´ä¸¥éã
åï¼Linphone
è¿ä¸ªæ¯èççsipï¼æ¯æå¹³å°å¹¿æ³ windows, mac,ios,android,linuxï¼ææ¯ä¼æ¯è¾æçãä½æ¯æ®ç©è¿çåäºè¯´linphoneå¨Androidä¸çbugæç¹å¤ï¼ç±äºå ¶ä»£ç å®å¨åºå¤§ï¼æ以æææ¶æ¾å¼èèLinphone.ä¸è¿å¦æè°æ跨平å°çéè¦ï¼å¯ä»¥èèLinphoneæè imsdroidåä¸é¢çwebrtc.ããã好åç°å¨å¼æºè½¯ä»¶é½è·¨å¹³å°äºããã
äº) webrtc
imsdroid,csipsimple,linphoneé½æ³æ³è®¾æ³è°ç¨webrtcçé³é¢ææ¯ï¼æ¬äººä¹æµè¯è¿Android端çwebrtcå ç½è§é¢éè¯ï¼æææ¯è¾æ»¡æãä½æ¯è¦æwebrtcåæä¸ä¸ªç§»å¨ç«¯çIM软件çè¯è¿æä¸äºè·¯è¦èµ°ï¼ä¸è¿webrtcåºæ¬ææ¯é½å·²ç»æäºï¼å æ¬p2pä¼ è¾ï¼é³è§é¢codec,é³é¢å¤çææ¯ãä¸è¿å ¶å 为ç®åä» æ¯æVP8çè§é¢ç¼ç æ ¼å¼ï¼QQä¹æ¯ï¼æ³åé«æ¸ è§é¢éè¯çè¦æ³¨æäºãVP8å¨ç§»å¨ç«¯ç硬件ç¼è§£ç æ¯æçå¹³å°æ²¡å 个ï¼RKå¯ä»¥æ¯æVP8硬件ç¼è§£ç ï¼ãä¸è¿webrtc代ç éçå°å¯ä»¥ä½¿ç¨å¤é¨codec,è¿ä¸ªè¿æ¯æå¸æè°å°Hçã
æ»ç»ï¼sipdroidæ¯è¾è½»é级ï¼çéåºäºjavaå¼åï¼é³é¢codecé¤å¤ï¼ï¼ç±äºå ¶é³è§é¢ç¼ç 以åP2Pä¼ è¾è¿ä¸åç¥æ¾ä¸è¶³ï¼ä¸å¤ªå¥½åå®å¶åå¼ååä¼åãimsdroid,éæ¾å°±æ¯ç´æ¥è°ç¨webrtcçåºï¼èæè¿webrtcæ´æ°çæ¯è¾é¢ç¹ï¼å¼åæ¯è¾æ´»è·ãå¦æè¦èªå·±å¨imsdroidä¸æ´æ°webrtcæ å¿å ¼å®¹æ§é®é¢ï¼å¸æimsdroidå¯ä»¥ç´æ¥æéè¦çwebrtcç¸å ³æºç å è¿å»ãcsipsimpleçè¯ï¼é½æ¯å´ç»pjsipçï¼webrtcçé½æ¯ä»¥pjsipæ件形å¼æ©å ç,类似gstreamer. webrtcå¦ææææ¯å®åçå¼åå ¬å¸ä¸ªäººè¿æ¯è§å¾å¯ä»¥éæ©è¿ä¸ªæ¥åï¼ä¸ä¸ªæ¯googleçåå ï¼ä¸ä¸ªæ¯å ¶è§é¢éè¯ç¸å ³å ³é®ææ¯é½æ¯è¾æççåå ã个人è§å¾å¦æè½ååºæ¥ï¼ææä¼ä¸éçã
音视频学习--Video Fast Update
音视频快速更新(VFU)功能解释与应用场景
VFU是什么?视频快速更新(VFU)是H.视频会议协议中的一项功能,允许在视频通话过程中快速恢复丢失的视频帧。当视频帧在传输过程中丢失时,接收端可以向发送端发送视频快速更新请求,发送端将尽快重传丢失的帧,帮助接收端快速恢复并显示丢失的视频信息。这有助于提高视频会议的整体质量。
VFU在实际中的使用场景?RFC中指出,VFU适用于基于会话初始化协议(SIP)的系统中,并在不同供应商的实时交互应用程序中使用。该功能由Microsoft、Polycom、Radvision开发,并被多个供应商使用。RFC指出VFU的缺点:使用SIP信令路径发送视频快速更新不如使用RTP控制协议(RTCP)反馈方法,因为命令流经信令路径中的皮影客源码所有代理,增加了消息延迟,并导致代理不必要的过载。因此,大部分场景还是通过RTCP消息端到端完成交互,而不是通过信令代理。
VFU传输视频控制命令可能导致视频数据发送方在允许的带宽内发送更多数据。
VFU的交互方式?VFU是以XML形式使用SIP INFO方法传输,“Content-Type”设置为“application/media_control+xml”。这种方法利用SIP内置的可靠性。
VFU工作原理?视频通过SIP服务器从发送端传输到视频接收端。首先发送I帧,然后发送后续P帧。在某些情况下,发送的后续P帧可能会损坏,并且可能会发生视频丢失。在这种情况下,视频接收器将向视频发送端发送VFU请求。VFU请求最初在SIP INFO消息中发送到SIP服务器,服务器将请求转发到视频发送端。一旦视频发送端接收到VFU请求,就会通过RTP流将I帧传输到视频接收端。一旦接收到I帧,后续的P帧按照新的I帧逐步发送。
VFU代码走读?依据RFC中提到的多种应用场景,VFU通常用于会议或实时音视频场景。当前正在学习linphone的源代码,其中包含该部分内容,所以以linphone代码为例完成VFU的相关走读。VFU发送流程涉及相关接口调用,之后会调用liblinphone中的同名API,过程相对容易理解。VFU接收流程在sal中收到相关信息,首先在coreinit时完成相关callback函数注册,sal收到sip反馈的VFU XML后,通过callback回调方式完成相关I帧数据的发送。
在linphone中,VFU相关功能体现在VideoEncoderInterface接口宏定义中,以及onRequestVfuCall()回调函数的人脸打卡源码处理。对于HxEncoderFilter类,requestVfu()函数用于向编码器请求视频快速更新,而process()和feed()函数在处理视频帧时,根据需要强制对关键帧进行编码。
总结,音视频快速更新(VFU)是H.视频会议协议中用于恢复丢失视频帧的一项功能。了解其工作原理、应用场景以及代码实现,对提高视频会议质量有重要作用。通过学习linphone的源代码,可以更深入理解VFU的实现细节。
野火鲁班猫卡片电脑创意氛围赛(第二期)基于鲁班猫1N的多媒体会话服务器
在本次的鲁班猫野火卡片电脑创意氛围赛(第二期)中,参赛者利用鲁班猫1N平台构建了一个创新的多媒体会话服务器。该系统依托RK的多媒体处理能力,选用了SIP作为访问控制协议,RTP/RTCP和UDP作为媒体控制与传输协议,旨在打造一个功能全面的网络音视频通信系统,具备音视频电话建立、实时编解码和通话控制等功能。
SIP,由IETF提出的协议,因其在多媒体会话控制中的优势,成为未来网络融合通信的主流。基于SIP设计的嵌入式服务器,具有高度兼容性和扩展性,支持多种流媒体,易于集成和减轻网络负担。作者选择OpenSIPS作为SIP服务器软件,它是一个开源的语音、视频、IM等SIP扩展的代理/服务器,适合在鲁班猫1N上安装。
搭建过程包括在Ubuntu.环境中配置,安装MySQL存储用户信息,从GitHub或Gitee获取OpenSIPS源码,通过menuconfig进行定制安装,并配置mysql、生成cfg文件和opensipsctlrc。阿里树源码通过添加用户和配置文件,最后进行系统测试,通过Linphone或Zoiper验证服务器连接,成功后可进行语音和短信通话。装上外壳后的鲁班猫1N,凭借良好的发热控制和SOC性能,胜任多媒体语音服务器角色。
wvp-GB-pro的安装与调试
本文将深入探讨WVP-GB-pro的安装与调试过程,特别关注其与ZLMediaKit的集成。首先,我们比较了几种GB服务模型,最后选定gosip+ZLMediaKit、Monibuca插件式和WVP-GB-pro+ZLMediaKit,本章节将重点讲解后者。 要开始安装,你可以从GitHub或Gitee下载最新版本的WVP-PRO软件,它支持多种主流监控品牌设备,如海康威视和大华。 安装步骤如下:基础环境准备:首先,安装Docker并在其内构建Redis、MySQL和ZLMediaKit环境。Redis用于存储和缓存,MySQL用于数据库,ZLMediaKit负责媒体处理。
Docker安装Redis:检查版本、下载镜像,设置映射端口,确保正常运行。
MySQL Docker安装:参考相关技术文章,配置数据库连接参数。
ZLMediaKit Docker安装:利用官方提供的安装命令,快速集成到项目中。
WVP-GB-pro编译:从源代码仓库获取,配置静态网页、打包jar,并调整必要的配置参数。
配置要点:例如,上传文件限制(max-file-size: MB, max-request-size: MB)、网络连接(REDIS: host、port等)、数据库连接(JDBC类型、驱动等)、数据映射(mybatis)、HTTP和HTTPS设置,以及SIP服务器配置等。
以下是一些关键配置项的示例:上传文件限制:max-file-size: MB, max-request-size: MB
REDIS连接:host: ..., port: , DB: 6, password: , timeout:
JDBC配置:HikariDataSource类型,驱动com.mysql.cj.jdbc.Driver, ...
mybatis映射:map-underscore-to-camel-case: true
HTTP服务器设置:server: port:
HTTPS配置:enabled: false, key-store: xxx.jks, key-store-password: password
SIP服务器配置:IP: ..1., port:
在实际操作中,务必根据具体需求调整这些配置。务必注意,由于篇幅限制,部分详细教程链接和编译过程中的具体步骤已省略,建议查阅完整的文档或教程以确保每个环节的正确执行。 最后,对于媒体参数获取和测试,推荐使用Apifox查询接口index/api/getServerConfig,以及强大的测试工具GB_ServerPlatform,通过其Client目录下的工具进行平台信息查看和实时视频播放测试。通过以上详细的安装步骤和配置指南,相信您已经对WVP-GB-pro的安装与调试有了一定的理解。接下来,可以根据这些信息逐步实施,确保监控系统的顺利集成和运行。
怎样使用linphoneapi编程?
Linphone是基于WEB的IP电话工具,可以运行于 Linux和Windows下。通过 Linphone可以在互联网上和其他人进行声音、视频通信。 Linphone是遵从SIP协议开发的,它需要和支持SIP协议的设备或者代理服务器进行相互操作。二、准备工作:
1、DVR联网:
两种方式:
T3DVR连接AI-BOX->T-BOX通过网络转发连接外网。
T3DVR直接接PC,利用PC的网络出外网(桥接)。
2、下载客户端
下载地址:]
[net_policy_0]
net使用ref参数传递
[misc]
唯一的机器生成的标识
[video]
是否显示、是否录像等标志位
[rtp]
rtp音频端口、视频端口等信息:
[sound]
铃声文件目录、音频频率等、
六、 Linphone中通信过程分析:
实验:两个电脑下载linphone进行通话,Wireshark进行抓包分析通信过程。
Linphone 地址为:
A: sip:linphone@...:
B: sip:linphone@...:
操作:
A给B打电话进行实验:
Wireshark置过滤信息:
(ip.src == ...)||(ip.src == ...)
过程:
SIP(Session Initiation Protocol,会话初始协议)是一个控制发起、修改和终结交互式多媒体(音视频、聊天、游戏等)会话的信令协议
1、主叫方发给被叫方的INVITE请求
2、B向A发送呼叫处理中的应答信号。
3、B向A发送 我正在震铃中,请稍等。
4、B向A发送 接通了。
5、A向B发送应答。
6、A和B互相通过RTP(Real-time Transport Protocol实时传输协议)发送音频或视频数据。
7、A要挂断了
8、关闭UDP服务
9、B知道A挂断了,相应ACK
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:/qq_/article/details/
opensips简介
在众多sip服务器中,主要分为两大类:一类侧重于媒体和业务服务器,比如freeswitch/asterisk,另一类侧重于代理和负载服务器,如opensips/kamailio。今天我们来介绍下opensips。
OpenSIPS是用于处理语音、视频、即时消息、在线状态以及其他SIP扩展的开源SIP代理服务器。它被运营商、电信公司或ITSP广泛应用于Class4/5平台、中继、企业/虚拟PBX解决方案、会话边界控制器、应用服务器、前端负载解决方案、IMS平台、呼叫中心等。
OpenSIPS推荐用于各种SIP场景和服务,其特点包括高吞吐量、路由和集成的灵活性以及有效的应用程序构建。它提供了超过个模块,用于SIP处理、后端操作、集成和路由逻辑。
接下来,我们介绍OpenSIPS的通用编译安装和配置启动流程。
开发环境需满足以下条件:CentOS版本6或以上、OpenSIPS版本2.4.9、GCC/C++版本4.4.7。
编译安装分为几个步骤:安装依赖库,如hiredis;然后从源码安装包中进行编译安装,有多种方法可选,如方法1或方法2。
安装完成后,目录结构默认位于/usr/local/opensips,需要检查安装目录。
创建数据库时需确保无数据库已存在,执行相应命令。
防火墙设置需根据不同版本的CentOS进行相应配置,例如CentOS6和CentOS7。
配置日志时,修改opensips.cfg和rsyslog.conf文件,新增logrotate.d/opensips文件,并设置定时任务,重启rsyslog服务。
设置TCP最大连接数限制,可通过用户级别、Linux系统级别调整,若服务器作为客户端时还需配置端口范围。通过查看sysctl.conf,使配置立即生效。
使用Linux下查看TCP连接数及状态的命令,统计特定端口的连接数,分析异常情况并封禁IP。
启动脚本可设置为开机自动启动,使用开机自动启动命令。启停命令提供启动和停止选项,启动时如果失败应检查日志文件。
配置文件主要用于配置OpenSIPS作为注册服务器的信令代理和负载节点。增加网关数据,配置sip软终端,并进行加载测试,通过sip软终端注册和发起呼叫,测试信令和媒体的连通性。
总的来说,OpenSIPS作为负载均衡的代理网关,性能优秀。通过配置文件,可以实现常见的网关功能,具体操作请参考OpenSIPS的子模块介绍和接口文档。
sipåè®®å¦ä½ç¨Cè¯è¨å®ç°
1ãå¼æºçsipæå¡å¨ç«¯ï¼æ¯è¾å¥½ç¨çæ¯Asteriskï¼æ åCç¨åºå®ç°ï¼ä»£ç æ¸ æ°ã
2ãsipçclientç¸å¯¹æ¯è¾å¤ï¼ä¸»è¦æexosip,pjsipåopalãexosipç®åæç¨ï¼å¨PCä¸ç¨æ¯è¾æ¹ä¾¿ãä½æ¯æ¶åçç¸å ³èµæºå¤ªå¤ï¼ç¨äºosip,srtp,ms2çä¼å¤çå¼æºåºï¼ms2ä¸é¢è¿ç¨å°äºffmpegï¼å«çä¸è¯´ï¼å ç¼è¯å°±æ¯å©æ¢¦ãopalåè½æ强ï¼è½ç¶ä¹ç¨å°äºffmpeg ï¼ä½æ¯èªå·±å°è£ çé常好ï¼éç¨æ件æ¹å¼ï¼è°ç¨çµæ´»ãopaléç¨classæ¹å¼æä¾å°è£ ï¼æ¥å£é常å好ãæè§å¯ä¸ä¸ç½çå°æ¹ï¼å°±æ¯ä½å±ä½¿ç¨äºptlibï¼è½ç¶å¤å¹³å°ä¸é½å¾å¥½ç¨ï¼ä½æ¾å¨åµå ¥å¼ä¸æè§ç¨åºå¤§äºä¸äºãpjsip精巧ï¼æ¹ä¾¿ç§»æ¤ï¼åµå ¥å¼ä¸åºè¯¥æ¯é¦éãä¸è¿è§é¢é¢æ¯ææ¹é¢æ©å±èµ·æ¥æ¯opal麻ç¦ã个人æè§ï¼å¯¹äºwindowså¼åè æ¥è¯´ï¼pjsipæ大ç好å¤å°±æ¯ä»£ç è°è¯æ¹ä¾¿ãæ´ä¸ªå·¥ç¨ä¸æ¬¡ç¼è¯éè¿ï¼å¦å¤ä¸¤ä¸ªåºè¿è¦æ¾å¾å¤ç¸å ³çèµæº
ã
3ãå ¶ä»çä¸äºåè®®æ ä¹è°è¯è¿ï¼æ¯å¦reSipphoneï¼å¥½è±¡æ¯è¿ä¸ªååï¼è¿æYateï¼ä¸è¿ä»å¿«éå¼åè§åº¦çï¼é½ä¸å¤ªåéãç°å¨æsipå¼åçï¼ä¸å¼å§å°±æ¯å æ¾å¥½åè®®æ ãlinphone,ekigaä»ä¹çï¼ä½åºå¤§ã对äºåå¼å§åçï¼æ好æ¯ä¸ä¸ªç²¾ç®çdemoãåæ¥æ¾å°pjsipä¸é¢çå 个ä¾åï¼æ ¢æ ¢å°äºè§£äºsipçå·¥ä½æµç¨ï¼å½ç¶å°ä¸äºæå å·¥å ·åtcpdumpã
ä¸è¿ï¼å ¶å®ï¼sip没ææ³è±¡ä¸çé£ä¹éº»ç¦ãç°å¨å头çï¼åå¼å§å项ç®ï¼ä½¿ç¨åè®®æ ç»å¯¹ä¸æ¯å¥½æ³æ³ãå¦ææ¢ä¸ªæ¹åï¼å çæSIPåºæ¬åè®®ï¼ç¶åèªå·±æ¹é ä¸ä¸ªï¼æå®å ¨åä¸ä¸ªï¼å¯è½æææ´å¥½ã
pjsip 本地视频预览怎么改变内容源的大小 iOS
1 把视频源当然文件来处理,sample有。不过这种方法用的不多。
2 修改vid_stream.c,在put_frame和get_frame里,换上我们自己的视频源。这种方法使用的最多,很多人在1.x版本里支持视频,就用这种方法。
3 重新构造sdp,自己创建rtp通道。
在sdp上,pjsua_call_make_call这个函数非常方便,直接呼叫对方。不过它在底层做了太多工作,比如启动了声卡。而不用这个函数,直接用比较底层的pjsip_inv_send_msg,自己处理的工作相对比较多(但不难,不过这样就不需要pjsua这个现成的程序了,所以我们继续用pjsua_call_make_call)。
不过还好,pj库提供了大量的回调,其中一个:on_call_sdp_created,就是在创建sdp后回调上来,由我们自己再修改。比如我们自己定义rtp的端口g_local_port。
void on_call_sdp_created(pjsua_call_id call_id,
pjmedia_sdp_session *sdp,
pj_pool_t *pool,
const pjmedia_sdp_session *rem_sdp)
{
int nPort;
if (sdp != NULL)
{
pjmedia_sdp_media *m = sdp->media[sdp->media_count-1];
m->desc.port = g_local_port;
pjmedia_sdp_conn *c = sdp->conn;
char* addr;
if (c)
addr= c->addr.ptr;
else
{
const pj_str_t *hostname;
pj_sockaddr_in tmp_addr;
char *addr;
hostname = pj_gethostname();
pj_sockaddr_in_init(&tmp_addr, hostname, 0);
addr = pj_inet_ntoa(tmp_addr.sin_addr);
sdp->conn = (pjmedia_sdp_conn *)pj_pool_zalloc (pool, sizeof(pjmedia_sdp_conn));
sdp->conn->net_type = pj_str("IN");
sdp->conn->addr_type = pj_str("IP4");
sdp->conn->addr = pj_str(addr);
}
sdp->origin.addr = *pj_gethostname();
}
}
同样,这里还可以修改payload type等。
这是发起呼叫时的,接收方收到后的回应之后,也会触发这个回调,自己设定RTP端口,payload type就可以了。
2
呼叫成功后,双方建立起连接关系,这时需要传rtp数据了。pjsua把这些工作都放在底层了,不做任何修改,只需要在发送和接收时,自己做一些处理就行。
先说接收方(参考siprtp.c源码):
pj_status_t init_local_rtp()
{
if (m_bInitMedia)
{
destroy_media();
}
//g_local_port = local_port;
pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);
pool = pj_pool_create(&(cp.factory), "test", , , NULL);
int status;
//status = pjmedia_endpt_create(&cp.factory, pjsip_endpt_get_ioqueue(pjsua_get_pjsip_endpt()), 0, &med_endpt);
status = pjmedia_endpt_create(&cp.factory, NULL, 1, &med_endpt);
status = pjmedia_rtp_session_init(&video.out_sess, , pj_rand());
status = pjmedia_rtp_session_init(&video.in_sess, , 0);
status = pjmedia_transport_udp_create(med_endpt, NULL, g_local_port, 0, &video.transport);
m_bInitMedia = true;
video.active = true;
return 0;
}
这段代码是本地启动rtp一个端口用来接收视频数据。
然后,从sdp得到对方发送的ip和端口,调用pjmedia_transport_attach,建立关联就可以了。