Linphone_android jni下音视频流、初始化流程分析

本文详细分析了Linphone Android JNI中音视频流的初始化过程,从linphone_call_init_media_streams开始,深入到音频流linphone_call_init_audio_stream和视频流linphone_call_init_video_stream的初始化细节,包括多媒体描述、RTP会话、多播角色、网络模拟等关键步骤。
摘要由CSDN通过智能技术生成
本来流程顺序上面做了排版(函数内部的流程,加了tab缩进的)方便理解, 但是发表之后,还是乱了。
流程顺序基本理清了,可以复制到notepad++,手动加下缩进吧。
主流程是序号 1、2、...
函数内部流程,简单点的标“=>”表示下,复杂的就安装节序号标了。

入口在linphonecall.c中,linphone_call_init_media_streams(call),函数内部包含三个函数:
	void linphone_call_init_media_streams(LinphoneCall *call){
   		linphone_call_init_audio_stream(call);
   		linphone_call_init_video_stream(call);
   		linphone_call_init_text_stream(call);
	}

A、 linphone_call_init_audio_stream(call) 音频流的初始化
1、char* rtcp_tool = linphone_core_get_user_agent(lc)
=>sal_get_user_agent(lc->sal),定义在sal.h,实现在sal_impl.c中;
=>belle_sip_header_user_agent_get_products_as_string(sal->user_agent, char[] user_agent,254),实现在belle_sip_headers_impl.c中;
=>list* list = user_agent->produtcts,
遍历list,将list->data的数据存在char[] user_agent中,并返回user_agent。
2、if call->audiostream !=null , call有问题,return;
3、if (call->sessions[call->main_audio_stream_index].rtp_session = null )
{
3.1、SalMulticastRole multicast_role = linphone_call_get_multicast_role(call,SalStreamType:SalAudio) :明确我发在通话中的角色(字面理解)
=> 检查call->op是否构建。
SalMediaDescription remotedesc = sal_call_get_remote_media_description(call->op),实现在sal_op_call.c中
=> return SalOp->base.remote_media;
SalMediaDescription localdesc = call->localdesc;
如果localDesc和remotedesc都不存在,且call的dir是outgoing,
继续判断, 如果外面的入参SalStreamType是SalAudio,且call->params->audio_multicast_enable 为true
则multicast_role 为SalMulticastSender;
else 如果localldesc存在,且(remotedesc不存在 或 sal_call_is_offerer(call->op)为true),感觉像是别人发起的call,且sdp_offering为ture
其中的sal_call_is_offerer 只是return call->op->sdp_offering;
找到本地支持的最优媒体流,stream_desc = sal_media_description_find_best_stream(localdesc,type)实现在sal.c中;
else 如果remotedesc存在,但sal_call_is_offerer(call->op)为false;
3.2、找到对方支持的最优媒体流,stream_desc = sal_media_description_find_best_stream(remotedesc, type); <==else结束
3.3、如果stream_desc存在,从它里面获取multicast_role;
3.4、外部继续做了remotedesc = sal_call_get_remote_media_description(call->op);
3.5、如果remotedesc存在,从中获取最优流媒体配置 :stream_desc = sal_media_description_find_best_stream(remotedesc, SalAudio);
3.6、初始化call的音频流属性call->audiostream=audiostream=audio_stream_new2() ,定义在mediastream.h,实现在audiostream.c
call->audiostream=audiostream=audio_stream_new2(lc->factory,linphone_call_get_bind_ip_for_stream(call,call->main_audio_stream_index),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值