Estoy tratando de aumentar la ganancia del micrófono de un teléfono Android para que sea capaz de escuchar sonidos muy pequeños. ¿Es posible? ¿Puedes ayudarme con esto?¿Podemos aumentar la ganancia del micrófono de un teléfono Android?
Respuesta
this link debería llevarlo más allá. use setStreamVolume (...) para establecer el volumen más alto. pero tenga en cuenta que hay un máximo que se puede solicitar llamando a getStreamMaxVolume (...). así que la ganancia de micrófono probablemente esté limitada por el hardware, supongo. por lo tanto, no es posible hacer esto "en marcha", pero ¿qué hay de grabar un poco, tratando de amplificar una frecuencia especial por equalizer y luego reconocer algo así como un latido del corazón? suena duro, pero tal vez sea posible.
¿cuál de las transmisiones listadas es para el micrófono? – Davita
control de ganancia de audio
public class MainActivity extends Activity {
public static final int SAMPLE_RATE = 16000;
private AudioRecord mRecorder;
private File mRecording;
private short[] mBuffer;
private final String startRecordingLabel = "Start recording";
private final String stopRecordingLabel = "Stop recording";
private boolean mIsRecording = false;
private ProgressBar mProgressBar;
float iGain = 1.0f;
CheckBox gain;
protected int bitsPerSamples = 16;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
initRecorder();
Button bluetooth = (Button)findViewById(R.id.blue);
gain = (CheckBox) findViewById(R.id.checkBox1);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
final Button button = (Button) findViewById(R.id.start);
button.setText(startRecordingLabel);
bluetooth.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent("");
}
});
gain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (gain.isChecked()) {
iGain = 5.0f;
} else {
iGain = 2.0f;
}
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
if (!mIsRecording) {
button.setText(stopRecordingLabel);
mIsRecording = true;
mRecorder.startRecording();
mRecording = getFile("raw");
startBufferedWrite(mRecording);
} else {
button.setText(startRecordingLabel);
mIsRecording = false;
mRecorder.stop();
File waveFile = getFile("wav");
try {
rawToWave(mRecording, waveFile);
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(),
Toast.LENGTH_SHORT).show();
}
Toast.makeText(MainActivity.this,
"Recorded to " + waveFile.getName(),
Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void onDestroy() {
mRecorder.release();
super.onDestroy();
}
private void initRecorder() {
int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
mBuffer = new short[bufferSize];
mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
bufferSize);
}
private void startBufferedWrite(final File file) {
new Thread(new Runnable() {
@Override
public void run() {
DataOutputStream output = null;
try {
output = new DataOutputStream(new BufferedOutputStream(
new FileOutputStream(file)));
while (mIsRecording) {
double sum = 0;
int readSize = mRecorder.read(mBuffer, 0,
mBuffer.length);
final int bytesPerSample = bitsPerSamples/8;
final int emptySpace = 64 - bitsPerSamples;
int byteIndex = 0;
int byteIndex2 = 0;
int temp = 0;
int mLeftTemp = 0;
int mRightTemp = 0;
int a = 0;
int x = 0;
for (int frameIndex = 0; frameIndex < readSize; frameIndex++) {
for (int c = 0; c < 1; c++) {
if (iGain != 1) {
long accumulator = 0;
for (int b = 0; b < bytesPerSample; b++) {
accumulator += ((long) (mBuffer[byteIndex++] & 0xFF)) << (b * 8 + emptySpace);
}
double sample = ((double) accumulator/(double) Long.MAX_VALUE);
sample *= iGain;
int intValue = (int) ((double) sample * (double) Integer.MAX_VALUE);
for (int i = 0; i < bytesPerSample; i++) {
mBuffer[i + byteIndex2] = (byte) (intValue >>> ((i + 2) * 8) & 0xff);
}
byteIndex2 += bytesPerSample;
}
}// end for(channel)
// mBuffer[frameIndex] *=iGain;
if (mBuffer[frameIndex] > 32765) {
mBuffer[frameIndex] = 32767;
} else if (mBuffer[frameIndex] < -32767) {
mBuffer[frameIndex] = -32767;
}
output.writeShort(mBuffer[frameIndex]);
sum += mBuffer[frameIndex] * mBuffer[frameIndex];
}
if (readSize > 0) {
final double amplitude = sum/readSize;
mProgressBar.setProgress((int) Math.sqrt(amplitude));
}
}
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(),
Toast.LENGTH_SHORT).show();
} finally {
mProgressBar.setProgress(0);
if (output != null) {
try {
output.flush();
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(),
Toast.LENGTH_SHORT).show();
} finally {
try {
output.close();
} catch (IOException e) {
Toast.makeText(MainActivity.this, e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
}
}
}
}).start();
}
private void rawToWave(final File rawFile, final File waveFile)
throws IOException {
byte[] rawData = new byte[(int) rawFile.length()];
DataInputStream input = null;
try {
input = new DataInputStream(new FileInputStream(rawFile));
input.read(rawData);
} finally {
if (input != null) {
input.close();
}
}
DataOutputStream output = null;
try {
output = new DataOutputStream(new FileOutputStream(waveFile));
// WAVE header
// see http://ccrma.stanford.edu/courses/422/projects/WaveFormat/
writeString(output, "RIFF"); // chunk id
writeInt(output, 36 + rawData.length); // chunk size
writeString(output, "WAVE"); // format
writeString(output, "fmt "); // subchunk 1 id
writeInt(output, 16); // subchunk 1 size
writeShort(output, (short) 1); // audio format (1 = PCM)
writeShort(output, (short) 1); // number of channels
writeInt(output, SAMPLE_RATE); // sample rate
writeInt(output, SAMPLE_RATE * 2); // byte rate
writeShort(output, (short) 2); // block align
writeShort(output, (short) 16); // bits per sample
writeString(output, "data"); // subchunk 2 id
writeInt(output, rawData.length); // subchunk 2 size
// Audio data (conversion big endian -> little endian)
short[] shorts = new short[rawData.length/2];
ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN)
.asShortBuffer().get(shorts);
ByteBuffer bytes = ByteBuffer.allocate(shorts.length * 2);
for (short s : shorts) {
// Apply Gain
/*
* s *= iGain; if(s>32767) { s=32767; } else if(s<-32768) {
* s=-32768; }
*/
bytes.putShort(s);
}
output.write(bytes.array());
} finally {
if (output != null) {
output.close();
}
}
}
private File getFile(final String suffix) {
Time time = new Time();
time.setToNow();
return new File(Environment.getExternalStorageDirectory(),
time.format("%Y%m%d%H%M%S") + "." + suffix);
}
private void writeInt(final DataOutputStream output, final int value)
throws IOException {
output.write(value >> 0);
output.write(value >> 8);
output.write(value >> 16);
output.write(value >> 24);
}
private void writeShort(final DataOutputStream output, final short value)
throws IOException {
output.write(value >> 0);
output.write(value >> 8);
}
private void writeString(final DataOutputStream output, final String value)
throws IOException {
for (int i = 0; i < value.length(); i++) {
output.write(value.charAt(i));
}
}
}
Hola @Shivaraj Patil, ¿podría explicarme sobre su código? ¿Aumenta el volumen del micrófono? Como veo, modifica el archivo de salida, no podemos ver cuando usamos el micrófono. – phongvan
Aumenta la amplitud multiplicando la ganancia promedio de cada muestra para que pueda aumentar o disminuir el volumen ajustando el valor de ganancia. No estoy seguro de que podamos ganar el micrófono porque la ganancia del micrófono probablemente esté limitada por el hardware. ¿Puedo saber qué es exactamente lo que estás tratando de hacer? –
- 1. ¿Podemos acceder al controlador de micrófono de mi teléfono Android
- 2. Cómo ajustar la ganancia del micrófono desde C# (necesita trabajar en XP y W7)
- 3. ¿Podemos subir fotos de la cámara del teléfono con HTML5
- 4. ¿Deshabilita la cancelación de ruido para micrófono en Android (1.5)?
- 5. obteniendo IMSI del teléfono Android?
- 6. Micrófono Android para seleccionar un tono específico
- 7. Android detectar evento de bloqueo del teléfono
- 8. control de volumen del micrófono desde javascript
- 9. Ocultar el botón del micrófono Teclado virtual de Android
- 10. Medición de la intensidad de la señal del teléfono "real" en un teléfono móvil
- 11. Simular micrófono (micrófono virtual)
- 12. Cómo transmitir la pantalla del teléfono Android a la PC
- 13. Cómo detectar golpes en el micrófono del dispositivo Android
- 14. Android: Recuperar el nombre del contacto del número de teléfono
- 15. manejo del evento de apagado del teléfono en Android
- 16. ¿Cómo ajustar el volumen del micrófono en Android?
- 17. Redirigir la salida de audio al altavoz del teléfono y la entrada de micrófono a los auriculares
- 18. Desactivando programáticamente el teléfono Android
- 19. Android - niveles de entrada de micrófono?
- 20. ¿Cómo construir Android sin la aplicación del teléfono?
- 21. Servidor que no reconoce la cookie del teléfono Android
- 22. HTML5 abra la cámara del teléfono iPhone o Android
- 23. Conexión de un teléfono Android con ADB
- 24. Cómo abrir la Configuración del teléfono Android en un botón haga clic en nuestra aplicación Android
- 25. Creación de un EBook para teléfono Android
- 26. muda Android teléfono/activar
- 27. Android LEER TELÉFONO ESTADO?
- 28. Android registro de error de lectura del teléfono
- 29. ¿Cómo detectar si un micrófono está presente en Android?
- 30. keyevent teléfono android bloqueado
¿Cuál es el caso de uso? –
estoy tratando de escuchar el latido del corazón a través del móvil ... así que para eso necesito un micrófono más sensible. si pudiéramos aumentar la ganancia del micrófono, sería útil para mí – srikanth
Interesante. Eche un vistazo aquí: http://developer.android.com/reference/android/media/AudioManager.html –