Android音频录制和播放已损坏

And*_*mas 7 java android

我正在尝试录制一个pcm声音文件并播放它.当我播放它时,它听起来很慢,并且比记录时间更长.我不确定错误是在记录还是播放代码中.有什么想法是什么问题?

我在很大程度上复制了这个例子中的代码:http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

这是记录代码(isRecording标志由gui线程中的停止按钮设置).

        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        int sampleRateInHz = 8000;//8000 44100, 22050 and 11025
        int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

        File sd = Environment.getExternalStorageDirectory();
        File file = new  File(sd, "msg.wav");

        if (file.exists())
            file.delete();

        try {
            file.createNewFile();
        } catch (IOException e) {
            Log.e("create file:", e.toString());
        }

        try {

            OutputStream os = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(os);
            DataOutputStream dos = new DataOutputStream(bos);

            int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat);
            short[] buffer = new short[bufferSize];
            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
                    sampleRateInHz,channelConfig, audioFormat,bufferSize);

            audioRecord.startRecording();

            isRecording = true;
            while (isRecording) {
                int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
                for (int i = 0; i < bufferReadResult; i++) 
                {
                    dos.writeShort(buffer[i]);
                }
            }
            dos.close();
Run Code Online (Sandbox Code Playgroud)

这是播放代码.

          File file = new File(SendAlert.voiceFile);
          // Get the length of the audio stored in the file (16 bit so 2 bytes per short)
          // and create a short array to store the recorded audio.
          int musicLength = (int)(file.length()/2);
          short[] music = new short[musicLength];


          try {
            // Create a DataInputStream to read the audio data back from the saved file.
            InputStream is = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(is);
            DataInputStream dis = new DataInputStream(bis);

            // Read the file into the music array.
            int i = 0;
            while (dis.available() > 0) {
              music[i] = dis.readShort();
              i++;
            }


            // Close the input streams.
            dis.close();     


            // Create a new AudioTrack object using the same parameters as the AudioRecord
            // object used to create the file.
            AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
                                                   8000, 
                                                   AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                                   AudioFormat.ENCODING_PCM_16BIT, 
                                                   musicLength, 
                                                   AudioTrack.MODE_STREAM);
            // Start playback
            audioTrack.play();

            // Write the music buffer to the AudioTrack object
            audioTrack.write(music, 0, musicLength);
Run Code Online (Sandbox Code Playgroud)

And*_*mas 0

问题是将示例中的采样率从 11025 更改为 8000。