2011-04-01 14 views
8

मैं एंड्रॉइड में नया हूं और मैं एक ऐसा प्रोग्राम बनाने की कोशिश कर रहा हूं जो ऑडियो ध्वनि को कैप्चर करता है और उसके बाद मौजूद आवृत्तियों को प्रदर्शित करता है। मुझे एक उदाहरण मिला जो ग्राफिक तुल्यकारक के ग्राफ़िक भाग को खींचता है। इस उदाहरण में ऑडियो ध्वनि को कैप्चर करने के लिए इसे ऑडियो रिकॉर्ड का ऑब्जेक्ट उपयोग किया जाता है। घटक आवृत्तियों में ऑडियो सिग्नल को तोड़ने के लिए उपयोग की जाने वाली तकनीक एक गणितीय परिवर्तन को एक अलग फूरियर ट्रांसफॉर्म (डीएफटी) कहा जाता है और डीएफटी करने के लिए इसे एक तेज फूरियर ट्रांसफॉर्म (एफएफटी) का उपयोग किया जाता है। यह उदाहरण एक पैकेज का उपयोग करता है जो एफएफटी लागू करता है। पैकेज www.netlib.org/fftpack/jfftpack.tgz से जुड़ा हुआ है। समस्या यह है कि मैं इस उदाहरण को चलाने के बाद स्टार्ट बटन दबाए जाने के बाद ग्राफिक तुल्यकारक प्रदर्शन पर प्रकट नहीं होता है।एंड्रॉइड में विश्लेषण और विज़ुअलाइजिंग फ्रीक्वेंसी के लिए ध्वनि कैप्चरिंग

<?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> 

AndroidManifest.xml में मैं RECORD_AUDIO अनुमति सेट:

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 है:

यहाँ गतिविधि वर्ग के लिए स्रोत कोड है। अग्रिम धन्यवाद!

+1

xml में छवि दृश्य टैग कहां है? – codeScriber

उत्तर

2

हां, मेरे पास यह प्रोजेक्ट भी था और मुझे आपके जैसा ही त्रुटि थी लेकिन नीचे अनुमति जोड़ने के बाद सभी ठीक है। शायद आपने इसे androidmanifest.xml में सही जगह में नहीं जोड़ा है। यह एप्लिकेशन टैग के बाहर होना चाहिए। जहां अपने कोड में के रूप में यह AudioProcessing से संबंधित है

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

onProgressUpdate विधि RecordAudio से संबंधित होना चाहिए। ब्रेसिज़ की जांच करें, इसे उपरोक्त सुधार

12

पर आधारित काम करना चाहिए, यह कार्य कोड है। मैंने इसे खुद कोशिश की। यह बढ़िया काम करता है।

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

बहुत बहुत धन्यवाद, इस तरह कुछ ढूंढ रहा था! – Larphoid

+1

कुछ प्रयोग करने के बाद ... मुख्य गतिविधि में (बस क्या होता है इसका पालन करना आसान बनाता है, और HEIGHT का उपयोग करने के लिए जहां कहीं भी 100 का उपयोग किया जाता था): \t स्थिर अंतिम int HEIGHT = 100; \t स्थैतिक अंतिम int MIDDLE = HEIGHT/2; \t स्थैतिक अंतिम int PEAK = MIDDLE/10; // थाइट/10 फिर ऑन प्रोग्रेसअपडेट में: \t int x = 0; \t (int i = 0; i Larphoid

संबंधित मुद्दे