Squeak.ru - шаблоны программирования

AudioRecorder не может быть инициализирован после попытки каждого варианта

Я прочитал много сообщений о проблемах с инициализацией AudioRecorder, поэтому я использовал функцию для проверки всех возможностей. К сожалению, нет рабочего. Что я должен проверить?

@Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.w("DEBUG", "Audio record");

    // Capture mono data at 16kHz
    int frequency = 44100;
    int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
    AudioRecord audioRecord=null;

    // The minimal buffer size CANNOT be merely 20ms of data, it must be
    // at least 1024 bytes in this case, this is most likely due to a MMIO
    // hardware limit.
    final int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
    Log.w("DEBUG", "Buffer size: "+bufferSize);
    try
    {

//      audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
//              frequency, channelConfiguration,
//              audioEncoding, bufferSize);
      audioRecord=findAudioRecord();

      short[] buffer = new short[bufferSize];
      if(audioRecord==null || audioRecord.getState()!= AudioRecord.STATE_INITIALIZED)
      {
        Log.w("DEBUG", "Can't start");
        //Log.w("DEBUG", "status: " + audioRecord.getState());
        return;
      }

      audioRecord.startRecording();


      // Blocking loop uses about 40% of the CPU to do this.
      int sampleNumber = 0;

      // We'll capture 3000 samples of 20ms each,
      // giving us 60 seconds of audio data.
      while (sampleNumber < 3000)
      {
        audioRecord.read(buffer, 0, 320);

//        for (int i = 0; i < buffer.length; i++)
//        {
//          fileBuffer[i * 2] = (byte) (buffer[i] & (short) 0xFF);
//          fileBuffer[i * 2 + 1] = (byte) (buffer[i] >> 8);
//        }


        sampleNumber++;
      }
    } catch (IllegalArgumentException e)
    {
      e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (IllegalStateException e)
    {
      e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    finally
    {
      if(audioRecord!=null && audioRecord.getState()==AudioRecord.STATE_INITIALIZED)
      {
        audioRecord.stop();
        audioRecord.release();
      }
    }


  }

  private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
  public AudioRecord findAudioRecord() {
    for (int rate : mSampleRates) {
      for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) {
        for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) {
          try {
            Log.w("DEBUG", "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(MediaRecorder.AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize);

              if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
                return recorder;
            }
          } catch (Exception e) {
            Log.w("DEBUG", rate + "Exception, keep trying.",e);
          }
        }
      }
    }
    return null;
  }

Вот результат:

10-06 22:18:33.828: WARN/DEBUG(26097): Частота попыток 8000 Гц, бит: 3, канал: 16 10-06 22:18:33.828: WARN/DEBUG(26097): Частота попыток 8000 Гц, бит: 3 , канал: 12 10-06 22:18:33.828: WARN/DEBUG(26097): частота попыток 8000 Гц, биты: 2, канал: 16 10-06 22:18:33.867: WARN/DEBUG(26097): частота попыток 8000 Гц , биты: 2, канал: 12 10-06 22:18:33.875: WARN/DEBUG(26097): Частота попыток 11025 Гц, биты: 3, канал: 16 10-06 22:18:33.875: WARN/DEBUG(26097) : Частота попыток 11025 Гц, биты: 3, канал: 12 10-06 22:18:33.875: WARN/DEBUG(26097): Частота попыток 11025 Гц, биты: 2, канал: 16 10-06 22:18:33.906: WARN/ DEBUG(26097): частота попыток 11025 Гц, биты: 2, канал: 12 10-06 22:18:33.929: WARN/DEBUG(26097): частота попыток 22050 Гц, биты: 3, канал: 16 10-06 22:18: 33.929: WARN/DEBUG(26097): частота попыток 22050 Гц, биты: 3, канал: 12 10-06 22:18:33.929: WARN/DEBUG(26097): частота попыток 22050 Гц, биты: 2, канал: 16 10-06 22:18:33.929: ПРЕДУПРЕЖДЕНИЕ/ОТЛАДКА (26097): в частота попыток 22050 Гц, биты: 2, канал: 12 10-06 22:18:33.929: WARN/DEBUG(26097): частота попыток 44100 Гц, биты: 3, канал: 16 10-06 22:18:33.929: WARN/DEBUG (26097): Частота попыток 44100 Гц, биты: 3, канал: 12 10-06 22:18:33.929: WARN/DEBUG(26097): Частота попыток 44100 Гц, биты: 2, канал: 16 10-06 22:18:33.937 : WARN/DEBUG(26097): частота попыток 44100 Гц, биты: 2, канал: 12 10-06 22:18:33.937: WARN/DEBUG(26097): запуск невозможен

У меня в манифесте следующее:

использует-sdk android:minSdkVersion="10" android:targetSdkVersion="16" использует-разрешение android:name="android.permission.RECORD_AUDIO"

Мой телефон Galaxy Ace. Что я должен проверить?


Ответы:


1

Я перезагрузил телефон, и теперь он работает. Я полагаю, что вызов release() в каждой ситуации (см. блок finally) существенен.

06.10.2013
  • Можете ли вы объяснить больше, пожалуйста? 26.08.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...