2011-04-01 11 views
8

Android'de yeniyim ve bir ses sesini yakalayan ve içinde bulunan frekansları görüntüleyen bir program yapmaya çalışıyorum. Grafik ekolayzırının grafik kısmını çizen bir örnek buldum. Bu örnekte, ses sesini yakalamak için AudioRecord tipinde bir nesne kullanılır. Bir ses sinyalini bileşen frekanslarına ayırmak için kullanılan teknik, ayrık bir Fourier dönüşümü (DFT) olarak adlandırılan ve DFT'yi gerçekleştirmek için bir matematiksel dönüşüm kullanır ve hızlı bir Fourier dönüşümü (FFT) kullanılır. Bu örnekte FFT'yi uygulayan bir paket kullanın. Paket burada www.netlib.org/fftpack/jfftpack.tgz ile bağlantılıdır. Sorun şu ki, bu örneği çalıştırdıktan sonra, grafik düğmesine basmadan önce ekrana grafik ekolayzır görünmüyor. Ben RECORD_AUDIO izni ayarlamak AndroidManifest.xml yılındaAndroid'de Analiz ve Görüntü Frekansları için Ses Yakalama

<?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" 
> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/hello" 
/> 
<ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" 
android:layout_height="wrap_content"></ImageView><Button android:text="Start" 
android:id="@+id/StartStopButton" android:layout_width="wrap_content" 
android:layout_height="wrap_content"></Button> 
</LinearLayout> 

: Burada

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<Void, double[], Void> { 
     @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: İşte

aktivite sınıf için kaynak kodudur. Şimdiden teşekkürler!

+1

Resimdeki xn görüntü etiketinin neresinde? – codeScriber

cevap

2

Evet, aynı zamanda bu projeyi de yaptım ve sizin de aynı hatayı aldım, ancak aşağıdaki izinleri ekledikten sonra her şey yolunda. Muhtemelen androidmanifest.xml içinde doğru yere eklemediniz. Uygulama etiketinin dışında olmalı. kodunuzda gibi AudioProcessing ait nerede

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

onProgressUpdate yöntemi RecordAudio ait olmalıdır. Diş tellerini kontrol edin, yukarıdaki düzeltmeye göre çalışın

12

İşte çalışma kodu. Kendim denedim. İyi çalışıyor.

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<Void, double[], Void> { 

     @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(); 
     } 
    } 
} 
+0

çok teşekkürler, böyle bir şey arıyordu! – Larphoid

+1

Bazı aktivitelerden sonra ... ana aktivitede (sadece ne olduğunu takip etmeyi kolaylaştırmak ve her 100 kullanıldığında HEIGHT kullanmak için): \t statik son int HEIGHT = 100; \t statik final int ORTA = YÜKSEKLİK/2; \t statik son int PEAK = ORTA/10; // YÜKSEKLİK/10 oldu, sonra onProgressUpdate: \t int x = 0; \t (int i = 0; i Larphoid

İlgili konular