使用socket在android和java服务器之间发送和接收音频
我想从android向java服务器发送音频。 以及从另一个android客户端接收的流式音频 使用下面的代码 对于android客户端:使用socket在android和java服务器之间发送和接收音频,java,android,sockets,Java,Android,Sockets,我想从android向java服务器发送音频。 以及从另一个android客户端接收的流式音频 使用下面的代码 对于android客户端: package com.kosarsoft.translator.activity; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.media.AudioFormat;
package com.kosarsoft.translator.activity;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import com.kosarsoft.classes.entity.tabs;
import com.kosarsoft.presenter.main.MainContract;
import com.kosarsoft.presenter.main.MainPresenterImpl;
import com.kosarsoft.translator.R;
import com.kosarsoft.translator.component.ButtonView;
import com.kosarsoft.translator.component.TextBlock;
import com.kosarsoft.translator.servers.MediaStreamClient;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import es.dmoral.toasty.Toasty;
import static com.kosarsoft.classes.Constant.USER_TYPE;
public class MainActivity extends AppCompatActivity implements MainContract.View {
private MainContract.Presenter presenter;
@BindView(R.id.rcvConferences)
RecyclerView rcvConferences;
@BindView(R.id.btnRightSlideMenu)
ImageView btnRightSlideMenu;
@BindView(R.id.drawer_layout)
DrawerLayout mDrawerLayout;
@BindView(R.id.right_drawer)
LinearLayout right_drawer;
@BindView(R.id.lstMenu)
ListView lstMenu;
@BindView(R.id.btnStart)
ButtonView btnStart;
@BindView(R.id.btnStop)
ButtonView btnStop;
@BindView(R.id.btnListen)
ButtonView btnListen;
public byte[] buffer;
public static DatagramSocket socket;
private String ip = "192.168.1.9";
private int port = 50005;
AudioRecord recorder;
private int sampleRate = 16000; // 44100 for music
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
private boolean status = true;
static final int frequency = 44100;
static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
private boolean r_status = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ButterKnife.bind(this);
presenter = new MainPresenterImpl(this, MainActivity.this);
presenter.getMenu();
if (USER_TYPE == 5) {
btnStart.setVisibility(View.VISIBLE);
btnStop.setVisibility(View.VISIBLE);
btnListen.setVisibility(View.VISIBLE);
} else {
btnStart.setVisibility(View.GONE);
btnStop.setVisibility(View.GONE);
btnListen.setVisibility(View.VISIBLE);
}
AudioManager mAudioMgr = (AudioManager) getSystemService(AUDIO_SERVICE);
mAudioMgr.setWiredHeadsetOn(true);
}
@OnClick({R.id.btnRightSlideMenu, R.id.btnStart, R.id.btnStop, R.id.btnListen})
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnRightSlideMenu:
mDrawerLayout.openDrawer(right_drawer);
break;
case R.id.btnStart:
status = true;
startStreaming();
break;
case R.id.btnStop:
status = false;
recorder.release();
break;
case R.id.btnListen:
//new MediaStreamClient(MainActivity.this, ip, 8072);
startReceiving();
break;
}
}
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(ip);
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);
System.out.println("MinBufferSize: " + minBufSize);
}
} catch (UnknownHostException e) {
Log.e("VS", "UnknownHostException");
} catch (IOException e) {
e.printStackTrace();
Log.e("VS", "IOException");
}
}
});
streamThread.start();
}
public void startReceiving() {
Thread r_Thread = new Thread(new Runnable() {
@Override
public void run() {
InputStream is = null;
Socket socket = null;
AudioTrack audioTrack = null;
while (r_status) {
try {
if (socket == null) {
socket = new Socket();
InetSocketAddress address = new InetSocketAddress("192.168.1.9", 8072);
try {
socket.setReuseAddress(true);
socket.connect(address, 6000);
System.out.println("connecting-");
} catch (IOException e) {
r_status = false;
e.printStackTrace();
}
}
is = socket.getInputStream();
byte[] buffer = new byte[2048];
is.read(buffer);
if (audioTrack == null) {
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 16000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffer.length, AudioTrack.MODE_STREAM);
audioTrack.play();
}
audioTrack.write(buffer, 0, buffer.length);
} catch (IOException e) {
r_status = false;
e.printStackTrace();
}
}
try {
is.reset();
} catch (IOException e) {
r_status = false;
e.printStackTrace();
}
}
});
r_Thread.start();
}
@Override
public void onError(String message) {
Toasty.error(MainActivity.this, message, Toast.LENGTH_LONG, false).show();
}
@Override
public void onNetworkError() {
}
@Override
public void getMenu(List tabsList) {
MenuListAdapter menuListAdapter = new MenuListAdapter(tabsList);
lstMenu.setAdapter(menuListAdapter);
}
private class MenuListAdapter extends BaseAdapter {
private List tabsList;
public MenuListAdapter(List tabsList) {
this.tabsList = tabsList;
}
@Override
public int getCount() {
return tabsList.size();
}
@Override
public tabs getItem(int i) {
return tabsList.get(i);
}
@Override
public long getItemId(int i) {
return tabsList.get(i).getId();
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if (view == null) {
LayoutInflater inflater = getLayoutInflater();
view = inflater.inflate(R.layout.lst_drawer_menu_item, null);
}
tabs tab = tabsList.get(i);
TextBlock lblName = view.findViewById(R.id.lblName);
ImageView imgIcon = view.findViewById(R.id.imgIcon);
try {
Resources resources = getResources();
final int resourceId = resources.getIdentifier("ic_title", "drawable", getPackageName());
Drawable drawable = resources.getDrawable(resourceId);
imgIcon.setImageDrawable(drawable);
} catch (Exception ex) {
ex.printStackTrace();
}
lblName.setText(tab.getTitle());
return view;
}
}
}
和java服务器:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.sound.sampled.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.*;
@SpringBootApplication
public class DemoApplication {
AudioInputStream audioInputStream;
static AudioInputStream ais;
static AudioFormat format;
static boolean status = true;
static int port = 50005;
static int sampleRate = 44100;
static ServerSocket serverSocket1;
public static void main(String[] args) {
receiveAudioFromAndroidClient();
//streamToClientFromLocalFlie();
SpringApplication.run(DemoApplication.class, args);
}
private static void receiveAudioFromAndroidClient() {
try {
DatagramSocket serverSocket = new DatagramSocket(50005);
serverSocket1 = new ServerSocket(8072);
byte[] receiveData = new byte[4096];
format = new AudioFormat(sampleRate, 16, 1, true, false);
while (status == true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
serverSocket.receive(receivePacket);
ByteArrayInputStream baiss = new ByteArrayInputStream(
receivePacket.getData());
ais = new AudioInputStream(baiss, format, receivePacket.getLength());
// A thread solve the problem of chunky audio
new Thread(new Runnable() {
@Override
public void run() {
toSpeaker(receivePacket.getData());
streamToClient(receivePacket.getData());
}
}).start();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static void streamToClient(byte[] data) {
Thread test = new Thread(new Runnable() {
@Override
public void run() {
try {
if (serverSocket1.isBound()) {
Socket socket = serverSocket1.accept();
socket.getOutputStream().write(data);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
test.start();
}
private static void streamToClientFromLocalFlie() {
try {
File soundFile = new File("E:\\Music\\Dariush\\Kisti.mp3");
try (ServerSocket serverSocker = new ServerSocket(8072);
FileInputStream in = new FileInputStream(soundFile)) {
if (serverSocker.isBound()) {
Socket client = serverSocker.accept();
OutputStream out = client.getOutputStream();
byte buffer[] = new byte[2048];
int count;
while ((count = in.read(buffer)) != -1)
out.write(buffer, 0, count);
}
} catch (Exception ex) {
ex.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void toSpeaker(byte soundbytes[]) {
try {
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(format);
//FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
//volumeControl.setValue(6.0206f);
sourceDataLine.start();
sourceDataLine.open(format);
sourceDataLine.start();
//System.out.println("format? :" + sourceDataLine.getFormat());
sourceDataLine.write(soundbytes, 0, soundbytes.length);
System.out.println(soundbytes.toString());
sourceDataLine.drain();
sourceDataLine.close();
} catch (Exception e) {
System.out.println("Not working in speakers...");
e.printStackTrace();
}
}
}
我从android客户端发送音频并在java服务器中接收,然后在服务器上播放声音,但当我从服务器通过套接字端口将音频发送到另一个android客户端时,声音被破坏了
我的代码中可能有什么问题
请帮帮我
对不起,我的英语很差你有什么解决办法吗?对不起,我找不到解决办法