Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用socket在android和java服务器之间发送和接收音频_Java_Android_Sockets - Fatal编程技术网

使用socket在android和java服务器之间发送和接收音频

使用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;

我想从android向java服务器发送音频。 以及从另一个android客户端接收的流式音频 使用下面的代码

对于android客户端:



    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客户端时,声音被破坏了

我的代码中可能有什么问题

请帮帮我


对不起,我的英语很差

你有什么解决办法吗?对不起,我找不到解决办法