linphone录音分析
linphone录音分析1
- 旧版linphone被叫通话过程
- 新版linphone被叫通话过程
- 在被叫通话时实现录音
- 开始录音
- answerRecord()
- acceptCall(Call call)
- 结束录音
- hangUp()
- TODO
linphone自 feature/record_audio_and_send_it_through_chat版本后对代码结构做了比较大的更改,在AndroidStudio上无法编译,因此尝试将新版linphone的acceptCall功能移植到旧版上,以实现通话录音的功能。
旧版linphone被叫通话过程
当有通话呼入时,在界面上滑动接收通话按钮(accept),即接通电话。按钮accept的触摸监听中主要调用了*answer()*方法。首先实例化一个CallParams对象,设置一些属性,然后主要调用了LinphoneManager.getInstance().acceptCallWithParams(mCall, params)方法接受通话。
private void answer() {if (alreadyAcceptedOrDeniedCall) {return;}alreadyAcceptedOrDeniedCall = true;//CallParams是一个包含不同的通话相关参数的接口CallParams params = LinphoneManager.getLc().createCallParams(mCall);boolean isLowBandwidthConnection = !LinphoneUtils.isHighBandwidthConnection(LinphoneService.instance().getApplicationContext());if (params != null) {params.enableLowBandwidth(isLowBandwidthConnection);} else {Log.e("Could not create call params for call");}if (params == null || !LinphoneManager.getInstance().acceptCallWithParams(mCall, params)) {// the above method takes care of Samsung Galaxy SToast.makeText(this, R.string.couldnt_accept_call, Toast.LENGTH_LONG).show();} else {if (!LinphoneActivity.isInstanciated()) {return;}LinphoneManager.getInstance().routeAudioToReceiver();LinphoneActivity.instance().startIncallActivity(mCall);}
}
新版linphone被叫通话过程
在accept方法中调用的是LinphoneManager.getCallManager().acceptCall(mCall)
方法,在该方法中实例化了CallParams参数,并调用了setRecordFile方法设置录音文件的路径。这在老版的linphone中并没有看到。
public boolean acceptCall(Call call) {if (call == null) return false;Core core = LinphoneManager.getCore();CallParams params = core.createCallParams(call);boolean isLowBandwidthConnection =!LinphoneUtils.isHighBandwidthConnection(LinphoneContext.instance().getApplicationContext());if (params != null) {params.enableLowBandwidth(isLowBandwidthConnection);params.setRecordFile(FileUtils.getCallRecordingFilename(mContext, call.getRemoteAddress()));} else {Log.e("[Call Manager] Could not create call params for call");return false;}call.acceptWithParams(params);return true;
}
在被叫通话时实现录音
下载旧版的linphone,如release/4.0.1。在Android Studio中打开,等待gradle加载工程。对方有电话呼入时,滑动接受呼叫按钮后,双方建立通话连接。我想要在建立通话后即开始录音,并在点击通话结束按钮后停止录音。录音文件保存在手机某目录下,可以直接播放。
开始录音
首先要找到代码调用的位置。可以通过布局文件查找对应的活动(Activity)或者碎片(Fragment),这个布局文件对应的是活动call/CallIncomingActivity.java
.ImageView accept
对象通过findViewById(R.id.accept)
方法绑定到接受通话按钮上,通过重写setOnTouchListener
方法处理ImageView上的移动事件,当事件为**ACTION_MOVE**
,并满足一定条件时,将执行answer()方法。
answerRecord()
为了实现录音功能,在这里我用一个answerRecord()
方法替代answer()
方法。
/*** wlf 1127*/
private void answerRecord() {if (alreadyAcceptedOrDeniedCall) {return;}Log.i("wlf","CallIncomingActivity#answerRecord!");alreadyAcceptedOrDeniedCall = true;if (!CallManager.getInstance().acceptCall(mCall)) {// the above method takes care of Samsung Galaxy SToast.makeText(this, R.string.couldnt_accept_call, Toast.LENGTH_LONG).show();}
}
代码很简单,从新版linphone中扒过来,主要就是调用了CallManager.getInstance().acceptCall(mCall)
方法,但是现在CallManager类中并没有这个方法,需要去实现它。
acceptCall(Call call)
/*** wlf 1127* @param call* @return*/
public boolean acceptCall(Call call) {if (call == null) return false;Log.i("wlf","CallManager#acceptCall!");CallParams params = LinphoneManager.getLc().createCallParams(call);//TODO :params.setMediaEncryption();boolean isLowBandwidthConnection =!LinphoneUtils.isHighBandwidthConnection(LinphoneService.instance().getApplicationContext());if (params != null) {params.enableLowBandwidth(isLowBandwidthConnection);String filePath = FileUtils.getCallRecordingFilename(LinphoneService.instance().getApplicationContext(), call.getRemoteAddress());Log.i("wlf","filePath = " + filePath);params.setRecordFile(filePath);} else {Log.e("[Call Manager] Could not create call params for call");return false;}call.acceptWithParams(params);LinphoneManager.getInstance().routeAudioToReceiver();LinphoneActivity.instance().startIncallActivity(call);call.startRecording();Log.i("wlf","after startIncallActivity!");return true;
}
首先还是实例化对象CallParams,并设置一些参数。
其中setRecordFile()
需要的参数是一个String类型的文件保存路径,我们通过FileUtils
中的getCallRecordingFilename
获取,该工具类只在新版中有,所以直接把整个文件拷贝到org/linphone
路径下。AS会提示一些缺库错误,可以直接把它们注释掉,保证getCallRecordingFilename
方法没问题就可以。另外,因为我们只需要录音,而不需要录视频,所以这里把getCallRecordingFilename
方法内的fileName += format.format(new Date()) + ".mkv"
改为fileName += format.format(new Date()) + ".wav"
。
call对象接受了参数params,就可以启动通话界面,然后调用call.startRecording()
开始录音了。
结束录音
通话开始后,将进入活动CallActivity.java
。
在onClick(View v)中监听按钮的点击事件,结束通话的按钮是R.id.hang_up。当点击该按钮时,将调用hangUp()方法。
hangUp()
private void hangUp() {Core lc = LinphoneManager.getLc();Call currentCall = lc.getCurrentCall();Call.stopRecording();//wlf 1127Log.i("wlf"," CallActivity#hangUp.stopRecording!");if(crrentCall != null) {lc.terminateCall(currentCall)} else if (lc.isInConference()) {lc.terminateConference();} else {lc.terminateAllCalls();}
}
这里调用LinphoneManager.getLc().getCurrentCall()
方法获取到当前的Call对象,并中断通话。我们在中断通话前加入代码Call.stopRecording()
以停止录音
。
这样整个录音过程就结束了,可以在手机目录/storage/emulated/0/Linphone/recordings/目录下找到录音文件,测试是否录音成功
。
TODO
目前只是在被叫通话时测试了录音方法Call.startRecord()和Call.stopRecord()方法的可用性,方法调用的位置还需要进一步研究。
- 增加按钮,点击后可开始或者取消录音
- 录音加密和解密播放。
linphone录音分析相关推荐
- 智能会议系统(25)---linphone代码分析
linphone代码分析 最近在做linphone移植到hi3516d的工作,花了些时间弄懂了linphone和media2stream的运行过程,在这里分享出来,希望可以和大家一起探讨. 1.代码架 ...
- 使用计算机录音需要准被硬件和,电脑音频的制作及录音分析
摘要:近年来,随着科技的不断发展,互联网时代的到来,计算机已经被各行各业所使用,同时也产生了重大的影响.当前,电脑在音频制作以及录音方面的应用也得到了广泛的重视,对音频制作与声音录制有着不可忽视的作用 ...
- linphone代码分析
Linphone代码分析 一,Linphone4.0编译android版本 (环境ubuntu1864bits) 安装下列包: 1 sudo apt-get install yasm 2 ...
- Linphone录音器的初始化流程分析
初始化入口: linphone_core_init() --linphonecore.c 1793 static void linphone_core_init(LinphoneCore * lc, ...
- 讯飞tts语音引擎9.0_使用科大讯飞语音转文字的服务进行电话录音分析
# 需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容 ...
- 使用科大讯飞语音转文字的服务进行电话录音分析
需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容是否 ...
- 科大讯飞语音转文字_使用科大讯飞语音转文字的服务进行电话录音分析
# 需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容 ...
- linphone android 分析,Android平台上的Linphone学习(一)
Linphone: 适用于很多平台(Windows, Mac OS, Android)的VOIP电话工具, 基于标准SIP协议. Linphone-android: Android平台上的Linpho ...
- 跨平台SIP 客户端-linphone下载、使用
linphone 官网地址:https://www.linphone.org/ Github:https://github.com/BelledonneCommunications 开发指南:http ...
最新文章
- 【怎样写代码】对象克隆 -- 原型模式(五):原型管理器的引入和实现
- linux监听9080,基于UPnP发现与组播技术的IPTV终端实现
- 模拟电路基础秦世才_模拟电路电子技术基础知识
- golang 变量定义和初始化
- linux 内存交换参数,Ubuntu Linux:处理交换内存和内存使用情况
- Python Elasticsearch 插入数据
- linux实时信号与sigqueue函数编程实例
- 每日一题 Day8:CodeForces-996A.Hit the Lottery(贪心)
- 从社区报告看未来20年美国AI研究战略
- 一文搞懂X509证书PEM DER CRT CER的区别
- php 数独计算器,数独
- 21.运行Consent Page
- php eot html,PHP eot
- 华为路由器接口IP地址如何配置与查看
- vue核心之虚拟DOM(vdom)与真实DOM页面渲染过程
- python画圆形螺旋线_Python写的弹球小游戏
- 【英译中】如何拍好沙滩照2——2014年7月24日
- envi的三个窗口_ENVI显示窗口遥感影像显示遥感数据应用
- 石墨烯粉末, 是否导电?
- 市净率|介绍|解释|计算方法
热门文章
- 语言学与面对对象的设计
- Reentrant vs Thread-safe
- CDR无法启动此程序 因为计算机丢失,coreldraw(CDR)文件损坏或丢失的处理方法...
- OpenGL ES圆内放大、缩小、向某一点拉伸(曲线形变)算法
- 【数论】HDU5597 GTW likes function 的详细证明
- 通过shell命令访问HDFS
- Redis基础笔记--自认为很详细(●ˇ∀ˇ●)
- CAN通信最常用的标定协议--CCP与XCP
- 智能家居控制器的智能化设计与实现:最新技术、应用与趋势
- 曾国藩:最高明的人生活法,30 岁后请逼自己养成