在Android平台上开发语音交友软件源码,最重要的就是语音通话的实现,一般语音通话大概流程如下:语音采集,编解码,网络传输以及语音播放。如果算上UI交互的话,就是五个模块了。

整体流程大概是:A发送语音请求给B,A声音通过MIC被采集成PCM原始数据,然后经过编码压缩,再通过网络将编码后的音频数据传输出去;B端通过网络收到数据后进行解码处理,然后调用播放模块,进行音频数据的播放。

1、语音采集模块
Android平台语音交友软件源码开发,在语音通话中是通过AudioRecord接口来实现PCM数据的采集,这一步比较容易的。但需要注意的是AudioRecord接口的使用方法。构造AudioRecord 实例需要参数 public AudioRecord (int audioSource, intsampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

比如录音代码如下:

 static final int frequency = 8000;   static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;     static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;    int recBufSize,playBufSize; AudioRecord audioRecord;    recBufSize =  AudioRecord.getMinBufferSize(frequency,     channelConfiguration, audioEncoding);      audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, recBufSize);

2、语音播放
当语音交友软件源码中语音数据采集好了之后,接着可以实现语音播放模块。Android上实现PCM数据的播放也很简单,直接使用AudioTrack这个接口就行了。同样需要注意该接口的使用方法。AudioTrack的构造方式跟AudioRecord是对应的

 static final int frequency = 8000;   static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;     static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;    int recBufSize,playBufSize; AudioTrack  audioPlayer ;playBufSize =  AudioTrack.getMinBufferSize(frequency,     channelConfiguration, audioEncoding);        audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC,frequency,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT,playBufSize,AudioTrack.MODE_STREAM) ;

3、语音编解码
采集到的PCM数据是原始的语音数据,如果我们直接进行网络传输,那是不可取的。因此,要进行打包编码。
在语音交友软件源码开发中,编码我们需要第三方的库,把speex源码下载下来,写好JNI接口,在NDK环境编译一下,即可在java环境调用。
例如下面一个接口函数

 jint Java_com_audiocodec_talkdemo_AudioCodec_InitAudioEncodec( JNIEnv* env,jobject thiz,jint sampling_rate,jint audioLevel){if(nInitAudioCodecEncodeFlag == 1 || audioLevel < 3 || audioLevel > 8 )return 0 ;int  frame_size ;if(sampling_rate == 8000)
{
audio_Leval = 0 ;          capAudioLength = 160     ; capAudioBitrate = 8000  ;
}else if(sampling_rate == 16000)
{audio_Leval = 1 ;  capAudioLength = 320     ;  capAudioBitrate = 16000  ;
}else if(sampling_rate == 32000)
{audio_Leval = 2 ; capAudioLength = 640     ;  capAudioBitrate = 32000  ;  }elsereturn 0 ; tmp_Level = audioLevel ; //设置等级 15kbit/s
speex_mode = speex_lib_get_mode(audio_Leval) ; enc_state = speex_encoder_init(speex_mode);
speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&tmp_Level);int tmp = 30 ;//丢包补偿
int nRet = speex_encoder_ctl(enc_state, SPEEX_SET_PLC_TUNING, &tmp);
nRet = speex_encoder_ctl(enc_state, SPEEX_GET_PLC_TUNING, &tmp);speex_bits_init(&bits); nInitAudioCodecEncodeFlag = 1 ;return 1 ;}//编码音频数据
/*
参数jbyteArray  szAudio   等待编码的音频数据jbyteArray  szOut     编码后的音频数据
返回值成功返回 编码后长度失败返回 0
*/jint Java_com_audiocodec_talkdemo_AudioCodec_AudioEncode( JNIEnv* env,jobject thiz,jbyteArray szAudio,jbyteArray szOut)
{
if(nInitAudioCodecEncodeFlag == 0)return 0 ;jbyte* szAudioBuffer =  (jbyte *)(*env)->GetByteArrayElements(env,szAudio, 0);jbyte* szOutBuffer   =  (jbyte *)(*env)->GetByteArrayElements(env,szOut, 0);//清空bits ,以便编码speex_bits_reset(&bits);//进行编码int nRet = speex_encode_int(enc_state,(spx_int16_t*)szAudioBuffer, &bits);//把编码后的bits 结构,拷贝到cbits_enc的数据可以从网络发送出去,长度为nByte_encint nByte_enc = speex_bits_write(&bits, szOutBuffer, 200);(*env)->ReleaseByteArrayElements(env,szAudio,szAudioBuffer,0) ;(*env)->ReleaseByteArrayElements(env,szOut,szOutBuffer,0) ;return nByte_enc ;
}                                                 /*
函数功能 初始化编码器
参数无参数
返回值成功返回 1失败返回 0
*/
jint
Java_com_audiocodec_talkdemo_AudioCodec_ExitAudioEncodec( JNIEnv* env,jobject thiz)
{
if(nInitAudioCodecEncodeFlag == 1)
{
nInitAudioCodecEncodeFlag = 0 ;//销毁资源
speex_bits_destroy(&bits);
speex_encoder_destroy(enc_state);
enc_state = NULL ;
}else
return 0 ;
}

4 网络发送、接收

  //定义
DatagramSocket udpSocket  ;  //生成try {
udpSocket = new  DatagramSocket(6789);} catch (SocketException e1) {e1.printStackTrace();}//发送try {
udpSocket.send(sendPacket) ;} catch (IOException e) {
e.printStackTrace();}//接收udpSocket.receive(udpPackage); //关闭udpSocket.close() ;

以上就是“Android平台语音交友软件源码开发,语音通话的实现”的全部内容了,希望对大家有帮助。

Android平台语音交友软件源码开发,语音通话的实现相关推荐

  1. 什么是语音聊天软件源码,语音直播间礼物如何开发

    语音聊天软件源码是指,能够通过其搭建"用户使用其可以进行语音聊天操作"的软件源码. 语音聊天软件源码的形式是很多样的,它可以以直播的形式出现,可以以多人语音房间的形式出现,也可以用 ...

  2. 直播交友app开发,一对一视频直播聊天APP定制,语音直播交友软件源码

    直播类app近两年十分受欢迎,一对一视频直播交友,直播交友app目前主要是语音直播间陪玩,视频直播间打赏,pk,视频相亲,七人语音直播间,多人视频直播间,语音直播交友软件源码! 1,首页主播列表:包含 ...

  3. 视频交友直播软件源码开发的必备功能讲解

    相信通过这两年行业的发展我们不难看出.视频交友直播源码拥有简单直接的变现方式,深受平台和用户的喜爱,越来越多的年轻人也热衷于视频直播. 视频交友直播软件开发,支持用户在视频过程中用文字沟通,可以互相发 ...

  4. 国际短信系统平台软件源码开发路由功能—移讯云短信系统

    国际短信系统平台软件源码开发路由功能-移讯云短信系统 客户端功能介绍 1: 发送短信模块: 自定义号码短信,通讯录短信,资源短信. 2:提交任务模块: 查询当前登录账号提交的短信 3:短信明细模块: ...

  5. 一对一直播软件源码开发,一对一直播怎么开发

    直播行业自2016年的"千播大战",时至今日,直播平台内容同质化现象严重,反倒是一对一直播软件如"雨后春笋"般进入了人们的视野.一对一直播软件源码开发核心业务模 ...

  6. 直播软件源码开发,直播间内消息系统的实现

    在直播软件源码开发过程中,消息系统是非常关键的,无论是直播间内的消息还是平台内的消息,都关系着用户的使用体验,所以今天我们先用一个简单的"拉"模型搭建一个简单的直播间消息系统. 基 ...

  7. 期货平台搭建 期货系统软件源码开发贵不贵

    期货平台搭建 期货系统软件源码开发贵不贵?从目前市场来看,期货平台搭建并没有统一的报价规定.投资者朋友可以根据开发公司给出的产品性能.功能以及是否符合我们需求等,各方面来决定价格. 那除了价格,还有很 ...

  8. 一对一直播软件源码开发,iOS视频采集的实现过程

    在一对一直播软件源码日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的技术和原理进行梳理和总结. 认识 AVC ...

  9. 云瞻外卖江湖外卖满天星外卖美赚外卖CPS系统小程序软件源码开发

    云瞻外卖江湖外卖满天星外卖美赚外卖CPS系统小程序软件源码开发 外卖CPS红包小程序源码分享 外卖券外卖省省外卖探探美团饿了么外卖联盟优惠券小程序系统软件开发源码 美团/饿了么外卖CPS联盟返利公众号 ...

  10. 语音聊天室源码开发点赞功能,用 MySQL 还是 Redis ?

    为了提升用户在语音聊天室源码中的互动性,一般在开发动态广场功能时会支持用户间对动态进行点赞,所以点赞功能可以说是语音聊天室源码开发的基础性功能,今天我们就来聊聊点赞.评论.收藏等这些场景的db数据库设 ...

最新文章

  1. 神策数据助力海尔落地 6 大智慧厨房在线场景
  2. php asp.net core,asp.net core实例教程之配置
  3. 160523、Oracle建立表空间和用户
  4. VS在win32平台与mysql链接_mysql5.5.28-win32 + qt--4.8.2-vs2008 数据库驱动编译与连接...
  5. 常见损失函数及正则项
  6. eclipse启动mysql报错_Eclipse+mysql+java Eclipse中运行没有问题,但打包后运行不了,也不报错,求高手指点...
  7. (4.32)自定义函数整理大全
  8. Mysql学习总结(35)——Mysql两千万数据优化及迁移
  9. KTween 补间引擎
  10. 使用Mat分析大堆信息
  11. win10系统下360加速球不显示网速解决方法
  12. Java实现网页滑动验证与短信验证码案例精析
  13. stm8s003f3使用杂记
  14. 京东和淘宝近十年搜索热度对比,发现顶尖者的PK规律
  15. Oracle VirtualBox 6.1.18 安装扩展包
  16. 基于阿里云生活物联网平台的智能家居(物联网,智能家居,STM32,阿里云生活物联网平台,人脸识别,语音识别,语音交互)
  17. 经典点云配准算法:迭代最近点算法ICP(Iterative Closest Point)
  18. 程序员:为什么我抛弃了996工作?
  19. java与javax的区别
  20. 给地震监视器添加Notification

热门文章

  1. 关于图像处理中的矩阵卷积运算
  2. 龙哥手把手教你学LabVIEW视觉-深度学习简明教程【halcon篇】
  3. 详版大数据报告_《2018抖音大数据报告》完整版,赶快收藏!
  4. 阿里 离线数据同步工具 DataX 初试
  5. JAVA复习 (期末重点考点总结)
  6. 视觉目标跟踪算法收集-实时更新
  7. 局域网内window10和Windows7共享只有USB接口打印机的方法——以sharp2048D为例子
  8. wechat 微信ipad协议GO版本 最新不封号 长链接 完整版
  9. 微生物组数据系统发育分析的方法
  10. Android EditText 属性汇总