J'essaye d'augmenter le gain du micro d'un téléphone androïde de sorte qu'il soit capable d'entendre des sons très minuscules. Est-ce possible? Pouvez-vous s'il vous plaît m'aider avec cela.Pouvons-nous augmenter le gain du micro d'un téléphone android?
Répondre
this link devrait vous apporter plus loin. utilisez setStreamVolume (...) pour augmenter le volume. mais notez qu'il y a un maximum qui peut être demandé en appelant getStreamMaxVolume (...). donc le gain de micro est probablement limité par le matériel je devinerais. il n'est donc pas possible de le faire "à la volée" mais qu'en est-il de l'enregistrement un peu, en essayant d'amplifier une fréquence spéciale par equalizer puis de reconnaître quelque chose comme un battement de coeur? semble dur mais peut-être possible.
lequel des flux énumérés est pour le micro? – Davita
contrôle de gain 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));
}
}
}
Salut @Shivaraj Patil, Pourriez-vous expliquer votre code? Est-ce qu'il augmente le volume du micro? Comme je le vois, il modifie le fichier de sortie, nous ne pouvons pas voir lors de l'utilisation du microphone. – phongvan
Il augmente l'amplitude en multipliant le gain moyen de chaque échantillon afin que vous puissiez augmenter ou diminuer le volume en ajustant la valeur du gain. Je ne suis pas sûr que nous puissions gagner du micro parce que le gain de micro est probablement limité par le matériel. Puis-je savoir exactement ce que vous essayez de faire? –
- 1. Comment augmenter automatiquement le volume du micro dans le flash?
- 2. Android - Niveaux d'entrée micro?
- 3. C#: contrôle du téléphone Android
- 4. Configuration du téléphone android avec eclipse
- 5. Android: Activation programmée du numéro de téléphone
- 6. Android SDK - Référence l'application galerie du téléphone?
- 7. Android détecter l'événement de verrouillage du téléphone
- 8. Téléphone pente Android
- 9. Débogage d'une application Android sur le téléphone
- 10. Android envoi de données téléphone au téléphone
- 11. téléphone android contacts
- 12. création d'un dossier dans le téléphone android
- 13. Android: popup pour redémarrer le téléphone
- 14. Commande de singe sur le téléphone android?
- 15. localiser une adresse dans le téléphone android
- 16. Annuaire de téléphone Android
- 17. jouer le son du micro en utilisant le AUGraph
- 18. Saisir le micro-contrôleur info
- 19. Peut-on intercepter les signaux/événements de l'accessoire mains libres du téléphone Android?
- 20. Gain URL de recherche d'image google dans android
- 21. Le DUND d'Android prend-il en charge DUN DT (alias Dial Up client alias Data Terminal aka "dund --connect")
- 22. Obtenir le nom d'utilisateur android stocké dans le téléphone
- 23. Décoder le code qr de l'image stockée sur le téléphone avec Zxing (sur téléphone Android)
- 24. Appareils Android Compatible (non téléphone)
- 25. Android - L'ouverture du téléphone supprime l'état de l'application
- 26. Android lire les paramètres de proxy du téléphone
- 27. Android: Récupérer le nom du contact à partir du numéro de téléphone
- 28. Android comment créer un fichier dans la mémoire du téléphone
- 29. Obtenir les numéros de téléphone de téléphone Android
- 30. Déterminer le nord en utilisant le téléphone android
Quel est le cas d'utilisation? –
J'essaie d'entendre le rythme cardiaque à travers le mobile ... donc pour cela j'ai besoin d'un micro plus sensible. si nous pouvions augmenter le gain du micro, ça serait utile pour moi – srikanth
Intéressant. Jetez un oeil ici: http://developer.android.com/reference/android/media/AudioManager.html –