2012-01-15 2 views
0

Я работаю над приложением, которое может записывать звук воспроизведения, используя MediaRecorder и MediaPlayer. Я также хочу отобразить значение maxAmplitude. Я попытался использовать getMaxAmplitude, но я не могу заставить его работать. он продолжает возвращаться 0. Рекордер и проигрыватель работают правильно (это от разработчика.android.com). Может кто-то, пожалуйста, помогите мне с этим. В конце концов я хочу отобразить дБ, но я думаю, что смогу сделать это самостоятельно, как только я получу эту работу. Я новичок в android/java, поэтому каждая помощь приветствуется.Как использовать getMaxAmplitude - Android

мой код

public class AudioRecordTest extends Activity{ 
private static final String LOG_TAG = "AudioRecordTest"; 
protected static final String TAG = null; 
private static String mFileName = null; 
private RecordButton mRecordButton = null; 
private MediaRecorder mRecorder = null; 
private PlayButton mPlayButton = null; 
private MediaPlayer mPlayer = null; 
private int currentAmplitude; 
public boolean activeThread; 


private void onRecord(boolean start) { 
    if (start) { 
     startRecording(); 
    } else { 
     stopRecording(); 
    } 
} 

private void onPlay(boolean start) { 
    if (start) { 
     startPlaying(); 
    } else { 
     stopPlaying(); 
     } 
} 

private void startPlaying() { 
    mPlayer = new MediaPlayer(); 
    try { 
     mPlayer.setDataSource(mFileName); 
     mPlayer.prepare(); 
     mPlayer.start(); 
    } catch (IOException e) { 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 
} 

private void stopPlaying() { 
    mPlayer.release(); 
    mPlayer = null; 
} 

private void startRecording() { 
    if (mRecorder == null) { 

    mRecorder = new MediaRecorder(); 
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mRecorder.setOutputFile(mFileName); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    } 

    try { 
     mRecorder.prepare(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "prepare() failed"); 
    } 

    mRecorder.start(); 


} 

private void stopRecording() { 
    mRecorder.stop(); 
    mRecorder.release(); 
    activeThread = true; 
    mRecorder = null; 
} 


public void run() { 
    // TODO Auto-generated method stub   
    try { 
     activeThread = true; 
     while(activeThread){ 
      Log.i(TAG, "onRun()"); 
      Thread.sleep(50); 
      threadHandler.sendEmptyMessage(0); 

     }    
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

private Handler threadHandler = new Handler() { 
    public void handleMessage(android.os.Message msg) { 

     currentAmplitude = mRecorder.getMaxAmplitude(); 
     Log.i(TAG, "handleMessage : MaxAmplitude : "+Integer.toString(currentAmplitude)); 


    } 

}; 

class RecordButton extends Button { 
    boolean mStartRecording = true; 

    OnClickListener clicker = new OnClickListener() { 
     public void onClick(View v) { 
      onRecord(mStartRecording); 
      if (mStartRecording) { 
       setText("Stop recording"); 
      } else { 
       setText("Start recording"); 
      } 
      mStartRecording = !mStartRecording; 
     } 
    }; 

    public RecordButton(Context ctx) { 
     super(ctx); 
     setText("Start recording"); 
     setOnClickListener(clicker); 
    } 
} 

class PlayButton extends Button { 
    boolean mStartPlaying = true; 

    OnClickListener clicker = new OnClickListener() { 
     public void onClick(View v) { 
      onPlay(mStartPlaying); 
      if (mStartPlaying) { 
       setText("Stop playing"); 
      } else { 
       setText("Start playing"); 
      } 
      mStartPlaying = !mStartPlaying; 
     } 
    }; 

    public PlayButton(Context ctx) { 
     super(ctx); 
     setText("Start playing"); 
     setOnClickListener(clicker); 
    } 
} 

public AudioRecordTest() { 
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    mFileName += "/audiorecordtest.3gp"; 
} 

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    LinearLayout ll = new LinearLayout(this); 
    mRecordButton = new RecordButton(this); 
    ll.addView(mRecordButton, 
     new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      0)); 
    mPlayButton = new PlayButton(this); 
    ll.addView(mPlayButton, 
     new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      0)); 
    TextView tv = new TextView(this); 
    ll.addView(tv, 
      new LinearLayout.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       0)); 
    tv.setText(Integer.toString(currentAmplitude)); 
    setContentView(ll); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    if (mRecorder != null) { 
     mRecorder.release(); 
     mRecorder = null; 
    } 

    if (mPlayer != null) { 
     mPlayer.release(); 
     mPlayer = null; 
    } 
} 

}

ответ

0

Вы должны использовать тему или Handler, чтобы иметь возможность получить максимальное значение амплитуды в разное время. С вашим кодом вы на самом деле называете метод getMaxAmplitude() сразу после запуска MediaRecorder и только один раз, поэтому он нормальный, он даст вам 0.

Вот код, который я использовал для определения, когда звук идет ниже удельная амплитуда: http://pastebin.com/AradRpZm

+0

спасибо, я попробовал это, и это то, что я получил. Он по-прежнему не возвращает амплитуду. я неправильно реализовал ваш код? Мой новый код в верхней части этой страницы – Stiloboy

+0

Я посмотрю на него сегодня днем. –

+0

У вас его есть в работе? Otherwhise я выложу новый вопрос, чтобы заставить его работать, потому что я застрял atm. – Stiloboy

0

Я делаю это, и это нормально для меня. Надеюсь, это поможет!

public class MediaRecorder{ 

private MediaRecorder mRecorder = null; 
private Timer timer = new Timer(); 
File dir; 
String file; 

public Activity activity; 

public void startRecording() { 
    if (mRecorder == null) { 
     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mRecorder.setOutputFile(getFilename()); 
     try { 
      mRecorder.prepare(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mRecorder.start(); 
     mEMA = 0.0; 
    } 
} 

public void stopRecording() { 

    if (mRecorder != null) { 
     mRecorder.stop(); 
     timer.cancel(); 
     timer.purge(); 
     mRecorder.release(); 
     mRecorder = null; 
     deleteFile(); 
    } 
} 

private void deleteFile() { 

    File sdcard = new File(file); 
    boolean deleted = sdcard.delete(); 
    Log.i("Deleting File", String.valueOf(deleted)); 

} 

@SuppressLint("SdCardPath") 
private String getFilename() { 
    dir = new File("/sdcard", "AUDIO_RECORDERING"); 
    if (!dir.exists()) { 
     dir.mkdirs(); 
    } 

    file = dir.getAbsolutePath() + "/" + System.currentTimeMillis() 
      + ".mp3"; 
    return (file); 
} 

private double getAmplitude() { 
    if (mRecorder != null) { 
     double m = mRecorder.getMaxAmplitude(); 
     return (m); 
    } else { 

     return 0; 
    } 
} 

public double getAmplitudeEMA() { 
    double amp = getAmplitude(); 
    return amp; 
} 

}

1

Я использую этот код. Надеюсь, это сработает для вас!

private MediaRecorder _recorder; 
private MediaPlayer _player; 
private Timer _timer; 
private String _path; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_record); 

    _timer = new Timer(); 
    prepareEvents(); 
} 

public void prepareEvents() { 
    try { 
     Button recordButton = (Button) findViewById(R.id.buttonRecord); 
     Button stopButton = (Button) findViewById(R.id.buttonStop); 
     Button playButton = (Button) findViewById(R.id.buttonPlay); 

     recordButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        if(_recorder == null) { 
         File downloadFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS); 
         _path = downloadFolder.getAbsolutePath() + "/test1.aac"; 
         _recorder = new MediaRecorder(); 
         _recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
         _recorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS); 
         _recorder.setAudioSamplingRate(48000); 
         _recorder.setAudioEncodingBitRate(96000); 
         _recorder.setAudioChannels(2); 
         _recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
         _recorder.setOutputFile(_path); 
         _recorder.prepare(); 
         _recorder.start(); 

         _timer.schedule(new TimerTask() { 
          @Override 
          public void run() { 
           RecordActivity.this.runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             ((TextView) findViewById(R.id.textViewDecibelNumber)).setText(String.valueOf(_recorder.getMaxAmplitude())); 
            } 
           }); 
          } 
         },1000,1000); 
        } 
       } catch(Exception exception) {} 
      } 
     }); 

     stopButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        if(_recorder != null) { 
         _recorder.stop(); 
         _recorder.release(); 
         _recorder = null; 
         _timer.cancel(); 
         ((TextView) findViewById(R.id.textViewDecibelNumber)).setText("0"); 
        } else if(_player != null) { 
         _player.stop(); 
         _player.release(); 
         _player = null; 
        } 
       } catch(Exception exception) {} 
      } 
     }); 

     playButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        if(_recorder == null && _path != "") { 
         _player = new MediaPlayer(); 
         _player.setDataSource(_path); 
         _player.prepare(); 
         _player.start(); 
        } 
       } catch(Exception exception) { 
        System.out.println(exception.getMessage()); 
       } 
      } 
     }); 
    } catch(Exception exception) { 
     System.out.println(exception.getMessage()); 
    } 
}