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

在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  ;  
   }else
    return 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_enc
  int 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平台语音交友软件源码开发,语音通话的实现”的全部内容了,希望对大家有帮助。

imsdroid 是全功能的SIP / IMS的客户端,它基于doubango框架开发的app,doubango是目前世界上最好的3GPP IMS/RCS 嵌入式桌面系统框架,该框架提供了一套独特的功能,包括音频/视频通话、内容共享、消息、会议、通讯录等。 官网地址:http://code.google.com/p/imsdroid/ 组件 1、Boghe IMS/ RCS Windows客户端 2、IMSDroid IMS/ RCS Android客户端(使用NGN堆栈) 3、iDoubs IMS/ RCS iOS客户端(iPhone,iPad和iPod Touch) 4、OpenVCS 开源视频会议服务器,用于管理多点控制单元(MCU),每个MCU可以处理多达64人参与 5、Flash2IMS 使用Adobe Flash 的SIP/ IMS网关 支持功能 1、SIP ( RFC 3261 3GPP TS 24.229 REL- 9 ) 2、 IPv4 IPv6 TCP UDP 3、信号编码 SigComp (RFC 3320 、3485、 4077 、4464 、4465、4896、5049、5112、1951) 4、通讯录 5、GSMA 通信 6、 语音(GSMA VoLTE) 7、GSMA RCS and GSMA VoLTE 8 、IMS 登陆 MD5加密 9、3GPP 10、服务路由探索 11、注册事件监听(注册事件、拨打事件、来电事件、消息事件。。。) 12、3GPP IP ( 3GPP TS 23.038 、24.040 、 24.011、 24.341、24.451短信) 13、语音呼叫( G729AB1 、 AMR - NB 、iLBC、 GSM 、 PCMA 、 PCMU、 Speex NB ) 14、视频通话( H264、MP4V - ES 、Theora、 H.263 、 H.263 -1998 、H.261 ) 15、双音多频DTMF ( RFC 4733 ) 16、解决网络延迟和阻塞技术QoS negotiation using Preconditions (RFC 3312, 4032 and 5027 17、SIP会话定时器( RFC 4028 ) 18、临时响应( PRACK ) 19、通信保持(3GPP TS 24.610 ) 20、消息等待指示( 3GPP TS 24.606 ) 21、E.164号码呼叫通过使用ENUM协议( RFC 3761 ) 22、NAT穿越 23、一对一和群组聊天
Android版VoIP客户端App源代码,用以实现经典的语音及视频通话功能,开发环境的配置下载下来SipDroid源代码后,不能直接导入到eclipse中,否则是无法使用和编译的。   首先需要通过command line参照工程目录下的BUILT.txt文件对工程进行update。   如:android update project -p . -t 2(这里 -p指的是 --path -t指的是 --target)   由于是开源软件,需要版本控制的服务器,可以安装Subclipse(可以参见官网)   这样就可以将工程import到eclipse中了。   整理一些Android视频通话技术开发的资料:   SipDroid是一款开源的SIP/Voip客户端软件,针对Android手机开发平台。它是通过SIP provider来提供电话通信服务的,在它的最新的版本1.5.5beta中也提供了视频通话的服务。   它运行在标准的SIP协议之上,由于Android内核本身没有提供SIP协议栈,所以SipDroid软件中通过JNI直接实现了SIP协议栈。它能够在如下一些网络中提供VoiP服务:WLAN、3G、EDGE网络。甚至能够和Skype、Google Talk, MSN, Yahoo, AIM, and ICQ等用户进行通话。但前提必须到一些SIP provider注册账号(有免费的,也有收费的),SipDroid强烈建议使用PBXes这个sip provider来得到服务。   对于SipDroid实现视频通话的原理,目前的理解是:发送方是将是将视频数据传输到视频流媒体服务器,然后再传输给接收方的。具体细节目前不是很清楚,因为涉及到许多通信协议。   本项目共250 个目标文件,还有jni文件下c 文件需要编译。 感兴趣的同学必须得好好研究研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值