皮皮网

【顽石科技源码】【李伟齐okhttp源码分析】【医院网站源码30金币】pjsip源码

2024-11-23 12:40:21 来源:看盘源码公式

1.PJSIP源码探究 pjmedia-videodev模块
2.pjsip 本地视频预览怎么改变内容源的大小 iOS
3.sip协议如何用C语言实现
4.如何在 android 设备上使用 pjsip G.729 编解码的功能
5.webrtc linphone 到底哪个

pjsip源码

PJSIP源码探究 pjmedia-videodev模块

       PJSIP源码探索:pjmedia-videodev模块详解

       在上一章节中,我们已经了解了PJSIP在Android平台的编译和使用基础。接下来,我们将深入探究pjmedia-videodev模块,这一核心组件负责实现PJSIP的视频捕获功能。掌握这部分内容,顽石科技源码你将能够为PJSIP添加自定义视频输入设备。

       源码解析:视频捕获入口

       在pjsua2的Endpoint.java中,主要通过Endpoint对象的libCreate、libInit、libStart和libDestroy方法来调用底层的c++代码。其中,pjsua_init函数在pjsua_core.c的行中起关键作用,通过media_cfg参数,我们可以看出它与媒体相关。在pjsua_media_subsys_init中,初始化了音频和视频子系统,其中pjmedia_vid_subsys_init在pjsua_vid.c的行,负责初始化视频捕获设备。

       在pjmedia-videodev模块中,寻找视频捕获的李伟齐okhttp源码分析源头,pjmedia_vid_dev_subsys_init在pjmedia-videodev/videodev.c中负责视频设备的注册。在Android编译环境下,pjmedia_and_factory被注册,负责打开摄像头并获取画面。

       源码分析:pjmedia-vid-dev-factory

       Android摄像头捕获器工厂的实现位于pjmedia-videodev/android_dev.c,其中工厂实例的创建、设备信息的获取与管理,以及与Java类的交互都十分重要。工厂中的and_factory和factory_op结构体定义了工厂操作的接口,包括设备初始化、医院网站源码30金币信息查询和流创建等。

       视频设备流的操作在stream_op中定义,包括获取参数、设置视频功能、启动和停止相机,以及释放资源等。这些操作允许我们动态调整视频流,实现自定义画面捕获。

       总结:pjmedia-videodev模块功能概览

       pjmedia-videodev的核心是pjmedia_vid_dev_factory,它通过实现一系列操作函数,长沙溯源码燕窝产地如创建VideoStream和管理设备流,来捕获和处理视频数据。通过自定义VideoStream和其操作,开发者能够添加时间水印、滤镜效果,甚至捕获屏幕内容,为视频通话增添更多可能性。

       至此,关于pjmedia-videodev模块的源码探究已告一段落,希望你对视频捕获的经典服务端源码实现有了深入理解,期待你在PJSIP应用中发挥创意。

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,建立关联就可以了。

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基本协议,然后自己改造一个,或完全写一个,可能效果更好。

如何在 android 设备上使用 pjsip G. 编解码的功能

       ã€€ç¬¬ä¸€æ­¥æ˜¯ç”Ÿæˆ pjsip 为 Android (步骤为 Ubuntu Linux) 的源代码:

       ã€€ã€€1.设置 ANDROID_NDK_ROOT 环境变量设置为您 NDK 根文件夹。

       ã€€ã€€2.转到 pjsip 2.x 文件夹并创建 pjlib/include/pj/config_site.h 包括 config_site_sample.h ( #include <pj/config_site_sample.h> )

       ã€€ã€€3.运行./configure-android

       ã€€ã€€4.运行make clean && make depend && make

       ã€€ã€€ä¹‹åŽè¿™äº›æ­¥éª¤ï¼Œå°†æœ‰å‡ ä¸ªé™æ€åº“中的几个文件夹。建议将它们分组相同的文件夹 (最好在您的项目中) 中的:

       ã€€ã€€mkdir <your_project_path>/pjsip_libs

       ã€€ã€€find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/

       ã€€ã€€ä¸€æ—¦è‡ªå·±çš„所有库,您需要将这些库添加到您的项目 Android.mk 文件,这是由包括一个新的模块节每个图书馆。此模块部分应该是一样的东西:

       ã€€ã€€include $(CLEAR_VARS)

       ã€€ã€€LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi

       ã€€ã€€LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a

       ã€€ã€€include $(PREBUILT_STATIC_LIBRARY)

       ã€€ã€€ï¼Œå…¶å®žæ˜¯ä¸€èŠ‚中构建您的 JNI 项目的源代码,所有模块都添加到您的静态库的引用:

       ã€€ã€€LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi ...

       ã€€ã€€è¿™å°†åŒ…括 pjsip 的引用加入您的 JNI 库。现在,您需要配置 pjsip UA 实例。

       ã€€ã€€æœ‰ä¸€ä¸ªå…³äºŽ init 和开始的解释 pjsip 的 UA (pjsua) 在 pjsip/include/pjsua-lib/pjsua.h 但要遵循的主要步骤是:

       ã€€ã€€1.创建一个具有 UA 实例pjsua_create

       ã€€ã€€2.创建一个工作线程与pj_thread_create

       ã€€ã€€3.UA 实例的设置的默认配置:

       ã€€ã€€pjsua_config cfg æ¡© ;pjsua_logging_config log_cfg ;pjsua_media_config media_cfg ;

       ã€€ã€€pj_cli_cfg_default(&app_config.cli_cfg.cfg) ;pjsua_logging_config_default(&log_cfg) ;pjsua_media_config_default(&media_cfg) ;

       ã€€ã€€4.初始化堆栈与pjsua_init

       ã€€ã€€5.启动与堆栈pjsua_start

       ã€€ã€€ä»Žè¿™é‡Œï¼Œæœ‰å……足的配置选项 (日志、 媒体、 交通工具等)

       ã€€ã€€æ‚¨å¯ä»¥æ‰¾åˆ°åŸºæœ¬ PJSIP 教程在这里,和里面 pjsip 的源的根路径,有一个基本 (但不够完整,基本的 SIP 使用情况) 在:pjsip-apps/src/samples/simple_pjsua.c

       ã€€ã€€ç¼–辑:在生成时在 pjsip 应用程序的 android 项目,可以面临一个问题,因为 pjsua app 不生成默认情况下,对一般生成 (更具体地说,pjsua: 目标不包括所有上: 在 pjsip-应用程序/生成/生成文件的目标)。若要修复这只是转到 pjsip-应用程序/创建和运行:

       ã€€ã€€ä½¿ pjsua

       ã€€ã€€è¿™å°†åˆ›å»ºåœ¨æ­£ç¡®çš„对象文件: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (需要构建 android 样本时)。

       ã€€ã€€ä¸€æ—¦æ‰€æœ‰ç›¸åº”的对象文件,您可以在 pjsip-应用程序/src/pjsua/android 系统再次运行 ndk 生成

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的原因,一个是其视频通话相关关键技术都比较成熟的原因。个人觉得如果能做出来,效果会不错的。