1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Android平台语音交友软件源码开发 语音通话的实现

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

时间:2019-05-10 20:32:58

相关推荐

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 ; }elsereturn 0 ; tmp_Level = audioLevel ; //设置等级 15kbit/sspeex_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 ;}elsereturn 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平台语音交友软件源码开发,语音通话的实现”的全部内容了,希望对大家有帮助。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。