【问题标题】:Recording in Android giving exceptions在 Android 中录制给出异常
【发布时间】:2011-05-26 13:44:21
【问题描述】:

当我尝试使用以下代码通过模拟器录制音频时

  AudioRecord recordInstance = new AudioRecord(
    MediaRecorder.AudioSource.MIC, this.getFrequency(), this
      .getChannelConfiguration(), this.getAudioEncoding(),
    bufferSize);

然后我在 logcat 中得到以下异常:

12-16 19:07:31.680: INFO/jdwp(223): Ignoring second debugger -- accepting and dropping
12-16 19:07:31.700: ERROR/AudioHardware(34): Error opening input channel
12-16 19:07:31.720: WARN/AudioHardwareInterface(34): getInputBufferSize bad sampling rate: 11025
12-16 19:07:31.730: ERROR/AudioRecord(294): Recording parameters are not supported: sampleRate 11025, channelCount 1, format 1
12-16 19:07:31.730: ERROR/AudioRecord-JNI(294): Error creating AudioRecord instance: initialization check failed.

12-16 19:07:31.730: ERROR/AudioRecord-Java(294): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.
12-16 19:07:31.730: WARN/dalvikvm(294): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
12-16 19:07:31.770: ERROR/AndroidRuntime(294): FATAL EXCEPTION: Thread-8
12-16 19:07:31.770: ERROR/AndroidRuntime(294): java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
12-16 19:07:31.770: ERROR/AndroidRuntime(294):     at android.media.AudioRecord.startRecording(AudioRecord.java:495)
12-16 19:07:31.770: ERROR/AndroidRuntime(294):     at com.prospeak.Recorder.run(Recorder.java:84)
12-16 19:07:31.770: ERROR/AndroidRuntime(294):     at java.lang.Thread.run(Thread.java:1096)

你能弄清楚这段代码有什么问题吗?

【问题讨论】:

    标签: android audiorecord


    【解决方案1】:

    另外,请确保您在 AndroidManifest.xml 中设置了此权限: <uses-permission android:name="android.permission.RECORD_AUDIO" />

    【讨论】:

      【解决方案2】:

      我最近遇到了类似的问题。如前所述,您必须循环查看采样率、通道配置、音频格式的所有可能组合,以了解适合给定手机的内容。模拟器 AFAIK,不支持音频输入,并且总是会在 AudioRecord 对象上给出初始化错误。因此,您必须在真实设备上测试您的代码。 但此外,我发现您可以为 AudioRecord 对象提供的缓冲区大小有一个最大限制。它必须在几个 KB 的某个地方。我尝试将其设置为大约 10 MB,但它一直给出相同的初始化错误。所以要小心。这是循环显示格式和采样率的代码(由 StackEx 提供):

       private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
      private static short [] aformats = new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT };
      private static short [] chConfigs = new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO };
      
      
      public AudioRecord findAudioRecord() {
          for (int rate : mSampleRates) {
              for (short audioFormat : aformats) {
                  for (short channelConfig : chConfigs) {
                      try {
                          Log.d("Log:", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: "
                                  + channelConfig);
                          int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
      
                          if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                              // check if we can instantiate and have a success
                              AudioRecord recorder = new AudioRecord(android.media.MediaRecorder.AudioSource.MIC, rate, channelConfig, audioFormat, java.lang.Math.max(bufferSize,1024*800));
      
                              if (recorder.getState() == AudioRecord.STATE_INITIALIZED){
                                  Chosen_SR = rate;
                                  audFormat = audioFormat;
                                  chanConfig = channelConfig;
                                  return recorder;
                              }
      
                          }
                      } catch (Exception e) {
                          Log.e("Log:", rate + "Exception, keep trying.",e);
                      }
                  }
              }
          }
          return null;
      }
      AudioRecorder mRecord = findAudioRecord();
      

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        确保检查audiorecord.getState() == initialized

        链接帖子中的示例代码:

        https://stackoverflow.com/questions/tagged/sample-rate+android

        【讨论】:

          【解决方案4】:

          只有录音才能使用,

              AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                      8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                      AudioFormat.ENCODING_PCM_16BIT, 500000);
              recorder.startRecording();
          

          我找了很久,最后才发现,但它只会产生噪音,尝试获得高质量的音频

          【讨论】:

            【解决方案5】:

            错误是:

            getInputBufferSize bad sampling rate: 11025
            

            您需要不同的采样率。您可以循环遍历潜在的采样率,直到没有异常为止。

            至于尝试从模拟器录制,它在 Android 开发者网站上说这是不可能的,因此最好从手机测试或使用预先录制的样本。

            【讨论】:

              【解决方案6】:

              如果您尚未在清单中注册录制音频的权限,则会收到错误消息。

              【讨论】:

              【解决方案7】:

              您的采样率错误,请尝试 8000Hz。这是一个模拟器限制。

              【讨论】:

              • 非常感谢弗拉基米尔和克里斯蒂安。它的工作。但是当我录制音频时,播放时没有声音。此外,如何在特定时间段捕获语音的分贝值。基本上我想捕捉一些 3-5 秒的声音,并想知道声音的高低响度。请提出实现它的方法。谢谢 Parvendra
              猜你喜欢
              • 2013-11-26
              • 2023-03-22
              • 2011-03-03
              • 1970-01-01
              • 2013-02-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多