Обработка микрофонного входа - PullRequest
3 голосов
/ 14 августа 2011

Я пытаюсь получить аудиоданные с микрофона. Я добился этого с помощью класса AudioRecord, который заполняет буфер с типом шорт.

В конце концов я хотел бы построить график этого буфера, чтобы получить осциллографическое отображение (информацию в реальном времени). Проблема в том, что если я хочу отобразить значение (скажем, в тексте), мне нужен другой поток для обновления пользовательского интерфейса. В настоящее время я делаю это с помощью AsyncTask и обновляю пользовательский интерфейс с AsyncTasks.publishProgress(). Пока что я не очень успешен и хотел бы знать, нахожусь ли я на правильном пути? Ручки - лучший способ пойти? Есть ли кто-нибудь, кто делал что-то подобное раньше, и если да, то какой метод работал для вас? Кроме того, возможно ли вообще просто опросить микрофон?


Вот мой код. Он предназначен для вывода каждого образца чтения из MIC. Похоже, что делать это с приемлемой скоростью, но иногда показывает ноль. Почему?

* * 1010

А вот и main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_vertical|center_horizontal"
    >

<TextView android:id="@+id/percent_field"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content"
          android:gravity="center_horizontal"/>

</LinearLayout>

Обратите внимание, что вам нужно добавить это в AndroidManifest.xml

<uses-permission android:name="android.permission.RECORD_AUDIO" />

Я использую LG Optimus Black. Пожалуйста, помогите мне сделать этот код максимально эффективным.

Ответы [ 2 ]

1 голос
/ 16 августа 2013

Это поздний ответ, но, возможно, кому-то нужен ответ на тот же вопрос.Вот ссылка на Android-осциллограф с открытым исходным кодом (OsciPrime) (http://android.serverbox.ch/?p=268).). Исходный код использует Thread вместо AsyncTask. Если вы видите исходный код, вы можете выяснить, как Thread обрабатывает AudioRecord с помощью Looper и Handler. Я надеюсь,это полезно другим :)

1 голос
/ 14 августа 2011
  1. Если вам нужно обновить поток пользовательского интерфейса из любого потока, вы всегда можете использовать Activity.runOnUiThread(Runnable action). См. Activity класс Javadoc для деталей.
  2. Я не уверен, что именно вы подразумеваете под "просто опросить микрофон", но, на мой взгляд, AudioRecord - хороший способ записи микрофона. Вот ссылка на пример реализации, которая читает частоту записанного аудио в прямом эфире: http://www.anddev.org/novice-tutorials-f8/get-frequency-data-from-microphone-in-real-time-t16774.html

Надеюсь, это поможет.

...