Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Implementar getMaxAmplitude para audioRecord

Estoy utilizando audioRecord en lugar de mediarecorder en mi aplicación que funciona bien, pero tengo una lógica que depende altamente de la maxamplitude que es realmente difícil de obtener utilizando el audiorecord aquí es lo que estoy usando al leer el buffer

private void writeAudioDataToFile(){ byte data[] = new byte[bufferSize]; String filename = getTempFilename(); FileOutputStream os = null; try { os = new FileOutputStream(filename); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } int read = 0; max=0; if(null != os){ while(isRecording){ read = recorder.read(buffer, 0, bufferSize); int ab = (buffer[0] & 0xff) << 8 | buffer[1]; amplitude = Math.abs(ab); if(amplitude>0&&amplitude<25000) isSilence=true; else isSilence=false; //System.out.println(">>>>>>>>>>>"+amplitude); if(AudioRecord.ERROR_INVALID_OPERATION != read){ try { os.write(buffer); } catch (IOException e) { e.printStackTrace(); } } } try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } 

Pero esto no funciona para mí como el valor de los cambios reales rápido necesito implementar algo como getMaxAmplitude () para audioRecord.

  • Manera correcta de manejar la barra de acción hasta el botón?
  • Objeto global de la aplicación Android
  • Manera correcta de manejar la advertencia de pelusa de NullPointerException de Android Studio
  • Cómo quitar todas las devoluciones de llamada de un controlador?
  • LibGDX: Escala de partículas
  • Android Game Development - Mover el teléfono
  • Obtención de error al inflar la clase android.support.design.widget.NavigationView
  • Desplazamiento de ListViews juntos
  • 3 Solutions collect form web for “Implementar getMaxAmplitude para audioRecord”

    Esto hace lo que quiere y más … entonces sale los puntos max a un archivo que es legible en excel. (Estaba resolviendo este problema yo mismo, así que el tiempo es fortuito.)

     package com.example.audiorecord; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private static final int RECORDER_SAMPLERATE = 44100; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO; private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; private AudioRecord recorder = null; private Thread recordingThread = null; private boolean isRecording = false; private String floatString = ""; Calendar c = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("ddMMMyyyy_HHmmss"); String formattedDate = df.format(c.getTime()); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setButtonHandlers(); enableButtons(false); int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING); } private void setButtonHandlers() { ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick); ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick); } private void enableButton(int id, boolean isEnable) { ((Button) findViewById(id)).setEnabled(isEnable); } private void enableButtons(boolean isRecording) { enableButton(R.id.btnStart, !isRecording); enableButton(R.id.btnStop, isRecording); } int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024 int BytesPerElement = 2; // 2 bytes in 16bit format private void startRecording() { final File logFile = new File("sdcard/log_"+formattedDate+".txt"); if (!logFile.exists()) { try { logFile.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement); recorder.startRecording(); isRecording = true; recordingThread = new Thread(new Runnable() { public void run() { writeAudioDataToFile(logFile); } }, "AudioRecorder Thread"); recordingThread.start(); } private void writeAudioDataToFile(File logFile) { // Write the output audio in byte short sData[] = new short[BufferElements2Rec]; while (isRecording) { // gets the voice output from microphone to byte format recorder.read(sData, 0, BufferElements2Rec); String sDataString = ""; double sDataMax = 0; for(int i=0; i<sData.length; i++){ if(Math.abs(sData[i])>=sDataMax){sDataMax=Math.abs(sData[i]);}; sDataString += "\n" + sDataMax; } try { //BufferedWriter for performance, true to set append to file flag BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); buf.append(sDataString); buf.newLine(); buf.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void stopRecording() { // stops the recording activity if (null != recorder) { isRecording = false; recorder.stop(); recorder.release(); recorder = null; recordingThread = null; } } private View.OnClickListener btnClick = new View.OnClickListener() { public void onClick(View v) { switch (v.getId()) { case R.id.btnStart: { enableButtons(true); startRecording(); break; } case R.id.btnStop: { enableButtons(false); stopRecording(); break; } } } }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); } return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 
     int amplitude = (buffer[0] & 0xff) << 8 | buffer[1]; amplitude = Math.abs(ab); 

    ¿Comete un error aquí? Creo que debería ser

     int ab = (buffer[0] & 0xff) << 8 | buffer[1]; int amplitude = Math.abs(ab); 

    Si su codificación es ENCODING_PCM_16BIT , entonces debe usar

     private int cAmplitude= 0; while(isRecording) { read = recorder.read(data, 0, bufferSize); for (int i=0; i<read/2; i++) { short curSample = getShort(data[i*2], data[i*2+1]); if (curSample > cAmplitude) { cAmplitude = curSample; } } Log.d("amplitude",Integer.toString(cAmplitude)); cAmplitude = 0; } private short getShort(byte argB1, byte argB2) { return (short)(argB1 | (argB2 << 8)); } 

    Para más información, echa un vistazo a Cómo grabar voz en formato "wav" en Android

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.