如何在Android中实现socket上的音频调用
我在简单的插座上搜索并发现了两部android手机之间的语音流或音频通话代码。我已经实现了这个,但是这个代码不起作用。我听不到任何声音 接收器代码:如何在Android中实现socket上的音频调用,android,audio,stream,voip,voice,Android,Audio,Stream,Voip,Voice,我在简单的插座上搜索并发现了两部android手机之间的语音流或音频通话代码。我已经实现了这个,但是这个代码不起作用。我听不到任何声音 接收器代码: private int sampleRate = 44100; private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private int sampleRate = 44100;
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
public void startReceiving() {
Thread receiveThread = new Thread (new Runnable() {
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket(50005);
Log.d("VR", "Socket Created");
byte[] buffer = new byte[256];
speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,minBufSize,AudioTrack.MODE_STREAM);
while(status == true) {
try {
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
socket.receive(packet);
Log.d("VR", "Packet Received");
//reading content from packet
buffer=packet.getData();
Log.d("VR", "Packet data read into buffer");
//sending data to the Audiotrack obj i.e. speaker
speaker.write(buffer, 0, minBufSize);
Log.d("VR", String.valueOf(buffer));
speaker.play();
} catch(IOException e) {
Log.e("VR","IOException");
}
}
} catch (SocketException e) {
Log.e("VR", "SocketException");
}
}
});
receiveThread.start();
}
发件人代码:
public void startStreaming() {
Thread streamThread = new Thread(new Runnable() {
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket();
Log.d("VS", "Socket Created");
byte[] buffer = new byte[minBufSize];
Log.d("VS","Buffer created of size " + minBufSize);
DatagramPacket packet;
final InetAddress destination = InetAddress.getByName("192.168.0.216");
Log.d("VS", "Address retrieved");
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize*10);
Log.d("VS", "Recorder initialized");
recorder.startRecording();
while(status == true) {
//reading data from MIC into buffer
minBufSize = recorder.read(buffer, 0, buffer.length);
//putting buffer in the packet
packet = new DatagramPacket (buffer,buffer.length,destination,port);
socket.send(packet);
}
} catch(UnknownHostException e) {
Log.e("VS", "UnknownHostException");
} catch (IOException e) {
e.printStackTrace();
Log.e("VS", "IOException");
}
}
});
streamThread.start();
}
我调试了代码,数据包成功传输,并调用了speaker.play()
。但是没有语音
我已经在单个应用程序和活动中实现了这段代码。使用两个按钮
开始收听
和开始流媒体播放
getMinBufferSize()
对于录音
和音轨
来说可能不一样(经过艰苦的学习)。确保您使用的是两者中较大的一个。对我来说一切都很好。。。只想问一下如何在公共IP
上发送数据包,比如119.43.214.5
。我制作了两个应用程序,它们可以在localhost
客户端上发送数据包,并获得服务器应用程序的IP
地址。问题是,IP
是一个公共的IP
,客户端没有在该应用程序上发送数据。这就是解决方案吗?我不明白你的真正意思。正如你在他的代码中看到的,他假设MinBuffSize from AudioRecord.getMinBufferSize()与AudioTrack.getMinBufferSize()的值相同。这对我来说是一个阻碍点,因为我以前也做过这样的假设。调试时,我发现AudioTrack.getMinBufferSize()返回的大小是AudioRecord.getMinBufferSize()的两倍(或者反过来,我记不起来了),因此录音机没有用足够的数据填充AudioTrack以播放声音。