package prox.voiceshare;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.pm.ActivityInfo;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class voiceshare extends Activity
{
private Button StartRecordButton=null;
//it needs to be a single-channel (monaural),
//little-endian, unheadered 16-bit signed PCM audio file sampled at 16000 Hz.
//44100Hz是当前唯一能保证在所有设备上工作的采样率,在一些设备上还有22050, 16000或11025。
static final int frequency = 8000; //8KHz
static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int recBufSize=0;
private AudioRecord audioRecord=null;
int playBufSize=0;
private AudioTrack audioTrack=null;
public MediaPlayer AnswerPlayer=null;
public Handler AudioRecordHandler=null;
public Runnable AudioRecordTask=null;
public boolean AudioRecordTimerRun=false;
public String RawFilePath="/sdcard/VoiceshareRecord.pcm";
public File RawFile = null;
public FileOutputStream RawFOStream=null;
public BufferedOutputStream RawBOStream=null;
public InputStream AnswerIStream = null;
public FileInputStream AnswerFIStream=null;
//-------------------------------------------------
static final int VOICE_FRAME_SIZE=480;
public String EncodeDataFilePath="/sdcard/VoiceshareEncodeResult.g726";
public String DecodeDataFilePath="/sdcard/VoiceshareDecodeResult.pcm";
//Multicast Encoded Voice Data!!!
static String MultiSenderAddress="229.2.2.2";
static int MultiSenderPort=8888;
static InetAddress IA=null;
static MulticastSocket MultiReceiver=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
//默认竖屏!!!
super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//16bits->recBufSize:1600 16bits->playBufSize:2972 8bits->playBufSize:1486
recBufSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration, audioEncoding);
Log.d("chenxupro", "recBufSize:"+recBufSize);
//recBufSize:1600
if(recBufSize<0)
{
recBufSize=1600*3;
//mBufferFrames = mBufferBytes / (numChannels * sampleBytes);
}
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, recBufSize);
playBufSize=AudioTrack.getMinBufferSize(frequency,channelConfiguration,audioEncoding);
Log.d("chenxupro", "playBufSize:"+playBufSize);
//playBufSize:1486
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,frequency,channelConfiguration,audioEncoding,playBufSize,AudioTrack.MODE_STREAM);
StartRecordButton=(Button)findViewById(R.id.StartRecordButton);
StartRecordButton.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
AudioRecordPD=new ProgressDialog(voiceshare.this);
AudioRecordPD.setMessage("Please Speak...");
AudioRecordPD.show();
new AudioRecordTask().execute("Start");
}
});
AudioRecordHandler = new Handler();
AudioRecordTask = new Runnable()
{
public void run()
{
//Stop!!!
if (AudioRecordTimerRun)
{
//HideList();
AudioRecordTimerRun = false;
}
}
};
try
{
IA = InetAddress.getByName(MultiSenderAddress);
}
catch(UnknownHostException e)
{
e.printStackTrace();
}
try
{
MultiReceiver = new MulticastSocket(MultiSenderPort);
}
catch(IOException e)
{
e.printStackTrace();
}
try
{
//MultiReceiver.setTimeToLive(255);
MultiReceiver.setTimeToLive(2);
//MultiReceiver.setReceiveBufferSize(10240);
//MultiReceiver.setSoTimeout(10); //Wait 10ms!!!
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
MultiReceiver.joinGroup(IA);
}
catch (IOException e)
{
e.printStackTrace();
}
}
private ProgressDialog AudioRecordPD=null;
private ProgressDialog AudioRecogPD=null;
// 设置三种类型参数分别为String,Integer,String
class AudioRecordTask extends AsyncTask<String, Integer, String>
{
// 可变长的输入参数,与AsyncTask.exucute()对应
@Override
protected String doInBackground(String... params)
{
//Start!!!
//Create New Raw File
RawFile=new File(RawFilePath);
try
{
RawFOStream = new FileOutputStream(RawFile);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
RawBOStream = new BufferedOutputStream(RawFOStream);
byte[] RecordBuffer = new byte[recBufSize];
audioRecord.startRecording();
AudioRecordHandler.removeCallbacks(AudioRecordTask);
AudioRecordTimerRun = true;
//AudioRecordHandler.postDelayed(AudioRecordTask, 5000);
while(AudioRecordTimerRun)
{
//1600->OK 960->OK!!!Has Lost???
int bufferReadResult = audioRecord.read(RecordBuffer, 0,VOICE_FRAME_SIZE*2); //480*2=960
Log.d("bufferReadResult", String.valueOf(bufferReadResult));
byte[] TmpBuf = new byte[bufferReadResult];
System.arraycopy(RecordBuffer, 0, TmpBuf, 0,bufferReadResult);
short[] ou_dec_pcmbuf=new short[VOICE_FRAME_SIZE]; //decoder output
short[] in_enc_pcmbuf=new short[VOICE_FRAME_SIZE]; //encoder input
short[] ou_enc_unpacked=new short[VOICE_FRAME_SIZE]; //encoder output
//byte[] TmpArr=new byte[VOICE_FRAME_SIZE*2];
byte[] TmpEnArr=new byte[VOICE_FRAME_SIZE/8*2];
VoiceEncode(TmpBuf, TmpEnArr);
DatagramPacket packet = new DatagramPacket(TmpEnArr, VOICE_FRAME_SIZE/8*2,IA,MultiSenderPort);
packet.setLength(VOICE_FRAME_SIZE/8*2); //480*2/8=120
try
{
MultiReceiver.send(packet);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
//RAEncodeFile.write(TmpEnArr, 0, VOICE_FRAME_SIZE/8*2); //480/8*2=120
/*
try
{
RawBOStream.write(TmpBuf, 0, bufferReadResult);
}
catch (IOException e)
{
e.printStackTrace();
}
*/
}
try
{
RawBOStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
RawFOStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
audioRecord.stop();
AudioRecordPD.dismiss();
//VoiceRecogByRawFile(RawFilePath);
return "OK!";
}
@Override
protected void onCancelled()
{
super.onCancelled();
}
@Override
protected void onPostExecute(String result)
{
Toast.makeText(voiceshare.this, "Record OK!", Toast.LENGTH_SHORT).show();
//AudioRecogPD=new ProgressDialog(voiceshare.this);
//AudioRecogPD.setMessage("Recoging...");
//AudioRecogPD.show();
//new AudioRecogTask().execute("Start");
////new
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
共57个文件
class:12个
c:8个
o:8个
G.726编码语音传输Android端代码,原理就是Android手机采集语音的PCM编码,然后用NDK在底层编码成G.726码流,通过组播在局域网传播,PC端接收数据,通过G.726动态连接库解码成PCM流,通过SDL库的播放出来,当然通话质量并不是很好。原文地址:http://www.chenxupro.com/proxblog/?p=79
资源推荐
资源详情
资源评论
收起资源包目录
G726AndroidSender.tar.gz (57个子文件)
G726AndroidSender
jni
g726.c 1KB
g726.h 258B
g72x.h 4KB
g711.c 9KB
g726_40.c 7KB
g726_24.c 6KB
g72x.c 15KB
private.h 2KB
g726_32.c 7KB
G726EnDe.c 1KB
g726_16.c 6KB
Android.mk 240B
AndroidManifest.xml 1KB
res
layout
main.xml 406B
drawable-ldpi
icon.png 2KB
drawable-mdpi
icon.png 3KB
drawable-hdpi
icon.png 4KB
values
strings.xml 171B
proguard.cfg 1KB
src
prox
voiceshare
voiceshare.java 14KB
obj
local
armeabi
libG726EnDe.so 81KB
objs
G726EnDe
g726_16.o 8KB
g72x.o 21KB
g726_32.o.d 5KB
g726_24.o.d 5KB
g726_40.o.d 5KB
G726EnDe.o 25KB
g726_40.o 8KB
g72x.o.d 5KB
g726_24.o 8KB
g711.o.d 144B
g726.o 6KB
g711.o 8KB
g726_32.o 8KB
g726_16.o.d 5KB
g726.o.d 5KB
G726EnDe.o.d 7KB
bin
voiceshare.apk 30KB
classes.dex 13KB
resources.ap_ 11KB
prox
voiceshare
R.class 510B
voiceshare$AudioRecordTask.class 4KB
R$layout.class 385B
voiceshare$VoiceEncodeDecodeTask.class 4KB
R$attr.class 331B
voiceshare$1.class 1KB
R$id.class 386B
voiceshare$AudioRecogTask.class 2KB
R$string.class 418B
voiceshare$2.class 700B
R$drawable.class 391B
voiceshare.class 5KB
.classpath 280B
assets
default.properties 362B
libs
armeabi
libG726EnDe.so 22KB
.project 813B
gen
prox
voiceshare
R.java 743B
共 57 条
- 1
chenxupro
- 粉丝: 50
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页