【问题标题】:Android Audio record and playback is corruptAndroid 音频录制和播放已损坏
【发布时间】:2012-09-28 17:01:46
【问题描述】:

我正在尝试录制 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();

这是播放代码。

          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);

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以尝试(录音?和)以立体声播放;如果输出花费的时间是输入的两倍,那会让我认为这是第一个问题。也许尽管以单声道捕获,但您正在编写立体声 wav 文件?

    如果回放的时间不是录制时间的两倍,那么比率是多少?

    【讨论】:

    • 有趣的是,它的长度是应有的两倍……但更改为立体声播放不起作用。听起来很奇怪。
    • 如果你尝试用立体声录制它会改变什么吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2012-04-09
      • 1970-01-01
      相关资源
      最近更新 更多