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()方法的可用性,方法调用的位置还需要进一步研究。

  1. 增加按钮,点击后可开始或者取消录音
  2. 录音加密和解密播放。

linphone录音分析相关推荐

  1. 智能会议系统(25)---linphone代码分析

    linphone代码分析 最近在做linphone移植到hi3516d的工作,花了些时间弄懂了linphone和media2stream的运行过程,在这里分享出来,希望可以和大家一起探讨. 1.代码架 ...

  2. 使用计算机录音需要准被硬件和,电脑音频的制作及录音分析

    摘要:近年来,随着科技的不断发展,互联网时代的到来,计算机已经被各行各业所使用,同时也产生了重大的影响.当前,电脑在音频制作以及录音方面的应用也得到了广泛的重视,对音频制作与声音录制有着不可忽视的作用 ...

  3. linphone代码分析

    Linphone代码分析 一,Linphone4.0编译android版本 (环境ubuntu1864bits) 安装下列包: 1     sudo apt-get install yasm 2    ...

  4. Linphone录音器的初始化流程分析

    初始化入口: linphone_core_init() --linphonecore.c 1793 static void linphone_core_init(LinphoneCore * lc, ...

  5. 讯飞tts语音引擎9.0_使用科大讯飞语音转文字的服务进行电话录音分析

    # 需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容 ...

  6. 使用科大讯飞语音转文字的服务进行电话录音分析

    需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容是否 ...

  7. 科大讯飞语音转文字_使用科大讯飞语音转文字的服务进行电话录音分析

    # 需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容 ...

  8. linphone android 分析,Android平台上的Linphone学习(一)

    Linphone: 适用于很多平台(Windows, Mac OS, Android)的VOIP电话工具, 基于标准SIP协议. Linphone-android: Android平台上的Linpho ...

  9. 跨平台SIP 客户端-linphone下载、使用

    linphone 官网地址:https://www.linphone.org/ Github:https://github.com/BelledonneCommunications 开发指南:http ...

最新文章

  1. 【怎样写代码】对象克隆 -- 原型模式(五):原型管理器的引入和实现
  2. linux监听9080,基于UPnP发现与组播技术的IPTV终端实现
  3. 模拟电路基础秦世才_模拟电路电子技术基础知识
  4. golang 变量定义和初始化
  5. linux 内存交换参数,Ubuntu Linux:处理交换内存和内存使用情况
  6. Python Elasticsearch 插入数据
  7. linux实时信号与sigqueue函数编程实例
  8. 每日一题 Day8:CodeForces-996A.Hit the Lottery(贪心)
  9. 从社区报告看未来20年美国AI研究战略
  10. 一文搞懂X509证书PEM DER CRT CER的区别
  11. php 数独计算器,数独
  12. 21.运行Consent Page
  13. php eot html,PHP eot
  14. 华为路由器接口IP地址如何配置与查看
  15. vue核心之虚拟DOM(vdom)与真实DOM页面渲染过程
  16. python画圆形螺旋线_Python写的弹球小游戏
  17. 【英译中】如何拍好沙滩照2——2014年7月24日
  18. envi的三个窗口_ENVI显示窗口遥感影像显示遥感数据应用
  19. 石墨烯粉末, 是否导电?
  20. 市净率|介绍|解释|计算方法

热门文章

  1. 语言学与面对对象的设计
  2. Reentrant vs Thread-safe
  3. CDR无法启动此程序 因为计算机丢失,coreldraw(CDR)文件损坏或丢失的处理方法...
  4. OpenGL ES圆内放大、缩小、向某一点拉伸(曲线形变)算法
  5. 【数论】HDU5597 GTW likes function 的详细证明
  6. 通过shell命令访问HDFS
  7. Redis基础笔记--自认为很详细(●ˇ∀ˇ●)
  8. CAN通信最常用的标定协议--CCP与XCP
  9. 智能家居控制器的智能化设计与实现:最新技术、应用与趋势
  10. 曾国藩:最高明的人生活法,30 岁后请逼自己养成