Захват звука для анализа и визуализации частот в Android

Я новичок в Android, и я пытаюсь создать программу, которая захватывает звуковой звук, а затем отображает частоты, которые существуют внутри него. Я нашел пример, который рисует графическую часть графического эквалайзера. В этом примере для записи звука используется объект типа AudioRecord. Техника, используемая для разрыва аудиосигнала на составляющие частоты, использует математическое преобразование, называемое дискретным преобразованием Фурье (DFT), и для выполнения DFT используется быстрое преобразование Фурье (FFT). В этом примере используется пакет, который реализует FFT. Пакет связан здесь: www.netlib.org/fftpack/jfftpack.tgz . Проблема в том, что после запуска этого примера графический эквалайзер не появляется на дисплее после нажатия кнопки запуска.

Вот исходный код для classа активности:

package com.audio.processing; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import ca.uol.aig.fftpack.RealDoubleFFT; public class AudioProcessing extends Activity implements OnClickListener{ int frequency = 8000; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; private RealDoubleFFT transformer; int blockSize = 256; Button startStopButton; boolean started = false; RecordAudio recordTask; ImageView imageView; Bitmap bitmap; Canvas canvas; Paint paint; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startStopButton = (Button) this.findViewById(R.id.StartStopButton); startStopButton.setOnClickListener(this); transformer = new RealDoubleFFT(blockSize); imageView = (ImageView) this.findViewById(R.id.ImageView01); bitmap = Bitmap.createBitmap((int)256,(int)100,Bitmap.Config.ARGB_8888); canvas = new Canvas(bitmap); paint = new Paint(); paint.setColor(Color.GREEN); imageView.setImageBitmap(bitmap); } private class RecordAudio extends AsyncTask { @Override protected Void doInBackground(Void... params) { try { int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); AudioRecord audioRecord = new AudioRecord( MediaRecorder.AudioSource.DEFAULT, frequency, channelConfiguration, audioEncoding, bufferSize); short[] buffer = new short[blockSize]; double[] toTransform = new double[blockSize]; audioRecord.startRecording(); while (started) { int bufferReadResult = audioRecord.read(buffer, 0, blockSize); for (int i = 0; i < blockSize && i < bufferReadResult; i++) { toTransform[i] = (double) buffer[i] / 32768.0; // signed 16 bit } transformer.ft(toTransform); publishProgress(toTransform); } audioRecord.stop(); } catch (Throwable t) { Log.e("AudioRecord", "Recording Failed"); } return null; } } protected void onProgressUpdate(double[]... toTransform) { canvas.drawColor(Color.BLACK); for (int i = 0; i < toTransform[0].length; i++) { int x = i; int downy = (int) (100 - (toTransform[0][i] * 10)); int upy = 100; canvas.drawLine(x, downy, x, upy, paint); } imageView.invalidate(); } public void onClick(View v) { if (started) { started = false; startStopButton.setText("Start"); recordTask.cancel(true); } else { started = true; startStopButton.setText("Stop"); recordTask = new RecordAudio(); recordTask.execute(); } } } 

Вот main.xml:

      

В AndroidManifest.xml я установил разрешение RECORD_AUDIO. Заранее спасибо !

Вот рабочий код. Я попробовал это сам. Он работает нормально.

 package com.example.frequencytest; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import ca.uol.aig.fftpack.RealDoubleFFT; public class MainActivity extends Activity implements OnClickListener { int frequency = 8000; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; private RealDoubleFFT transformer; int blockSize = 256; Button startStopButton; boolean started = false; RecordAudio recordTask; ImageView imageView; Bitmap bitmap; Canvas canvas; Paint paint; //AudioRecord audioRecord; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startStopButton = (Button) this.findViewById(R.id.start_stop_btn); startStopButton.setOnClickListener(this); transformer = new RealDoubleFFT(blockSize); imageView = (ImageView) this.findViewById(R.id.imageView1); bitmap = Bitmap.createBitmap((int) 256, (int) 100, Bitmap.Config.ARGB_8888); canvas = new Canvas(bitmap); paint = new Paint(); paint.setColor(Color.GREEN); imageView.setImageBitmap(bitmap); } public class RecordAudio extends AsyncTask { @Override protected Void doInBackground(Void... arg0) { try { // int bufferSize = AudioRecord.getMinBufferSize(frequency, // AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); AudioRecord audioRecord = new AudioRecord( MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize); short[] buffer = new short[blockSize]; double[] toTransform = new double[blockSize]; audioRecord.startRecording(); // started = true; hopes this should true before calling // following while loop while (started) { int bufferReadResult = audioRecord.read(buffer, 0, blockSize); for (int i = 0; i < blockSize && i < bufferReadResult; i++) { toTransform[i] = (double) buffer[i] / 32768.0; // signed // 16 } // bit transformer.ft(toTransform); publishProgress(toTransform); } audioRecord.stop(); } catch (Throwable t) { t.printStackTrace(); Log.e("AudioRecord", "Recording Failed"); } return null; } @Override protected void onProgressUpdate(double[]... toTransform) { canvas.drawColor(Color.BLACK); for (int i = 0; i < toTransform[0].length; i++) { int x = i; int downy = (int) (100 - (toTransform[0][i] * 10)); int upy = 100; canvas.drawLine(x, downy, x, upy, paint); } imageView.invalidate(); // TODO Auto-generated method stub // super.onProgressUpdate(values); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void onClick(View arg0) { // TODO Auto-generated method stub if (started) { started = false; startStopButton.setText("Start"); recordTask.cancel(true); } else { started = true; startStopButton.setText("Stop"); recordTask = new RecordAudio(); recordTask.execute(); } } } 

Да, у меня также был этот проект, и у меня была такая же ошибка, как и вы, но после добавления разрешения ниже все в порядке. Скорее всего, вы не добавили его в нужное место в файле androidmanifest.xml. Это должно быть вне тега приложения.

    

Метод onProgressUpdate должен принадлежать RecordAudio, где, как и в вашем коде, он принадлежит к AudioProcessing. Проверьте фигурные скобки, он должен работать на основе вышеуказанной коррекции

  • smoothScrollToPositionFromTop () не всегда работает так, как должно
  • Что такое IndexOutOfBoundsException? Как я могу это исправить?
  • Android 5.1.1 и выше - getRunningAppProcesses () возвращает только мой пакет приложений
  • Создание размытого прозрачного фонового эффекта
  • Использование контекста в fragmentе
  • Ошибка манифеста слияния
  • Добавление расширяемогоListView в NavigationView
  • Обнаружение из браузера, если определенное приложение установлено на Android
  • Вернуть ключевое событие в EditText
  • Каково использование файла res / values ​​/ public.xml на Android?
  • Получить тег реферера Google Analytics Android
  • Давайте будем гением компьютера.