麦克风流不清楚

时间:2013-11-07 06:30:31

标签: java android audio stream

我创建了一个应用程序,用于从用户的麦克风流式传输音频。应用程序中有两个部分:

  1. Android应用
  2. 用于收听应用程序发送的音频的Java类
  3. 我遇到的问题是,流正在发生,但流的质量很差,流中也有明显的中断。

    Android应用中的活动:

    public class SendActivity extends Activity {
        private Button startButton, stopButton;
    
        public byte[] buffer;
        public static DatagramSocket socket;
        private int port = 50005;
        AudioRecord recorder;
    
        private int sampleRate = 8000;
        @SuppressWarnings("deprecation")
        private int channelConfig = AudioFormat.CHANNEL_IN_MONO;
        private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig,
                audioFormat);
        private boolean status = true;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_send);
    
            startButton = (Button) findViewById(R.id.start_button);
            stopButton = (Button) findViewById(R.id.stop_button);
    
            startButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    status = true;
                    startStreaming();
    
                }
    
            });
    
            stopButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    status = false;
                    recorder.release();
                    Log.d("VS", "Recorder released");
    
                }
    
            });
    
            minBufSize += 2048;
            System.out.println("minBufSize: " + minBufSize);
        }
    
    
        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.1.20");
                        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();
        }
    }
    

    布局文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".SendActivity" >
    
    
    
        <Button
            android:id="@+id/stop_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/start_button"
            android:layout_alignBottom="@+id/start_button"
            android:layout_toRightOf="@+id/start_button"
            android:text="Stop" />
    
        <Button
            android:id="@+id/start_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="79dp"
            android:layout_marginTop="163dp"
            android:text="Start" />
    
    </RelativeLayout>
    

    用于收听音频的java类:

    class Server {
    
    AudioInputStream audioInputStream;
    static AudioInputStream ais;
    static AudioFormat format;
    static boolean status = true;
    static int port = 50005;
    static int sampleRate = 8000;
    
    public static void main(String args[]) throws Exception {
    
    
        DatagramSocket serverSocket = new DatagramSocket(port);
    
        /**
         * Formula for lag = (byte_size/sample_rate)*2
         * Byte size 9728 will produce ~ 0.45 seconds of lag. Voice slightly broken.
         * Byte size 1400 will produce ~ 0.06 seconds of lag. Voice extremely broken.
         * Byte size 4000 will produce ~ 0.18 seconds of lag. Voice slightly more broken then 9728.
         */
    
        byte[] receiveData = new byte[9000];
    
        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());
            //System.out.println("Reading...");
            toSpeaker(receivePacket.getData());
    
        }
    }
    
    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();
        }
    }
    }
    

    如何从应用程序到班级获得清晰连续的音频流?

0 个答案:

没有答案