С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
1

Как андроид может измерять уровень шума?

29.04.2015, 15:29. Просмотров 1591. Ответов 20
Метки нет (Все метки)

Приложения такие есть, а вот как сделать? Как можно реализовать (хоть бы даже с задержкой по времени)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2015, 15:29
Ответы с готовыми решениями:

Микрофон. Оценить уровень шума
Как можно сделать так чтобы с помощью микрофона была реакция на шум? Например 3...

Кто может программу написать на андроид?
Если есть умельцы для быстрой связи пишите <cut>

Как получить уровень громкости на Android
Как определить включен или выключен звук на Android?

Как получить уровень громкости звука?
Как получить уровень громкости звука(использую android studio)?

Уровень шума
Всем привет. Есть ли в Unity какой инструмент определяющий уровень шума? На...

20
danyasworld
4 / 4 / 1
Регистрация: 12.04.2015
Сообщений: 226
Завершенные тесты: 1
29.04.2015, 16:20 2
через микрофон.
1
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
29.04.2015, 16:35  [ТС] 3
а потом по проводам, да?
0
androbro
344 / 304 / 68
Регистрация: 17.10.2014
Сообщений: 903
29.04.2015, 16:41 4
Цитата Сообщение от Valakin Посмотреть сообщение
а потом по проводам, да?
а по вашему у андрюши уши что ли есть?
0
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
29.04.2015, 16:51  [ТС] 5
У андрюши? У андрюши все есть
Я верю в его светлое будущее,
микрофон чем не ухо? а камера-глаз, а динамик-язык.
Вы видели когда нить андрюшу без языка? я нет

нашел какой то метод .getMaxAmplitude();
буду пробовать, сам спросил сам ответил
0
androbro
344 / 304 / 68
Регистрация: 17.10.2014
Сообщений: 903
29.04.2015, 16:56 6
Цитата Сообщение от Valakin Посмотреть сообщение
сам спросил сам ответил
какой вопрос такой и ответ
так то danyasworld на Ваш вопрос и ответил
0
ILNAR_93
Android
239 / 238 / 50
Регистрация: 19.01.2013
Сообщений: 1,892
Записей в блоге: 3
30.04.2015, 08:00 7
Цитата Сообщение от Valakin Посмотреть сообщение
сам спросил сам ответил
Чем ответ danyasworld не угодил?
0
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
30.04.2015, 08:46  [ТС] 8
есть такой код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import java.io.IOException;
 
import android.app.Activity;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnInfoListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Vibrator;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity implements OnInfoListener {
    WindowManager.LayoutParams lp;
    Button messe;
    MediaRecorder micro;
    int ampli;
    TextView tv1;
    TextView tv2;
    String amplitext;
    Vibrator vibr;
    Environment e;
    String mFileName;
    int i;
    Boolean recording;
 
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window w = getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        setContentView(R.layout.activity_main);
        micro = null;
    }
 
    @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;
    }
 
 
    public void onBtnClicked(View v) {
            startRecording();
        }
 
    protected void startRecording() {
        if (micro == null){
            i ++;
            mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
            mFileName += "/audiorecord"+ i +".3gp";
            micro = new MediaRecorder();
 
            micro.setAudioSource(MediaRecorder.AudioSource.MIC);
            micro.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            micro.setOutputFile(mFileName);
            micro.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            micro.setMaxDuration(2000);
 
              try {
 
                micro.prepare();
            } catch (IllegalStateException e) {
                Toast.makeText(getApplicationContext(), "IllegalStateException called", Toast.LENGTH_LONG).show();
 
 
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(), "prepare() failed", Toast.LENGTH_LONG).show();
 
            }
 
              micro.start();
              micro.getMaxAmplitude();
              ampli = micro.getMaxAmplitude();
              tv1 = (TextView) findViewById(R.id.textView1);
              tv1.setText(Integer.toString(ampli));
 
        }
 
          micro.setOnInfoListener(new OnInfoListener() {
            @Override
            public void onInfo(MediaRecorder mr, int what, int extra) {
                if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
                    micro.stop();
                    recording = false;
                    micro.release();
                    micro = null;
                }
            }
        });
    }
 
    @Override
    public void onInfo(MediaRecorder mr, int what, int extra) {
        // TODO Auto-generated method stub
 
    }
}
спотыкаюсь
на

Java
1
2
3
4
5
micro.setAudioSource(MediaRecorder.AudioSource.MIC);
            micro.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            micro.setOutputFile(mFileName);
            micro.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            micro.setMaxDuration(2000);
логи смогу выложить позже
0
danyasworld
4 / 4 / 1
Регистрация: 12.04.2015
Сообщений: 226
Завершенные тесты: 1
30.04.2015, 15:17 9
есть одно приложение для разработки под андроид, там есть куча интересных примеров. Там есть пример на запись звука (audio record вроде) и там реализован уровень громкости(показывается в процентах) посмотри, думаю тебе поможет.
0
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
30.04.2015, 16:37 10
Поделюсь своим аудиорекордером
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
public class AudioRecordManager {
 
    public interface OnAudioRecordCallback {
        void onComplete(String path);
        void onFailed(int code);
    }
 
    public interface OnAudioRecordListener {
        void changeAmplitude(double value);
    }
    
    public void setOnAudioRecordCallback(OnAudioRecordCallback onAudioRecordCallback) {
        this.onAudioRecordCallback = onAudioRecordCallback;
    }
 
    public void setOnAudioRecordListener(OnAudioRecordListener onAudioRecordListener) {
        this.onAudioRecordListener = onAudioRecordListener;
    }
    
    private OnAudioRecordListener onAudioRecordListener;
 
    private OnAudioRecordCallback onAudioRecordCallback;
 
    private MediaRecorder myRecorder;
    private String outputFile = null;
 
    public AudioRecordManager() {
        handler = new Handler();
        audioRecordThread = new AudioRecordThread();
    }
 
    private Handler handler;
 
    private Runnable runnable;
 
    private AudioRecordThread audioRecordThread;
 
    public void startRecord() {
        if(audioRecordThread == null || !audioRecordThread.isRunning()){
            new Thread(audioRecordThread).start();
        }
    }
 
    public void stopRecord() {
        if(audioRecordThread!=null && audioRecordThread.isRunning()) {
            audioRecordThread.stopRecording();
        }
    }
 
    public double getAmplitude() {
        if (myRecorder != null)
            return (myRecorder.getMaxAmplitude());
        else
            return 0;
    }
 
    class AudioRecordThread implements Runnable {
 
        private boolean isRunning;
 
        private boolean isStop;
 
        private long startTime;
 
        private void startRecord() {
 
            isRunning = true;
            isStop = false;
            File folder = new File(Content.AUDIO_DIR);
            if (!folder.exists()) {
                boolean b = folder.mkdirs();
            }
            startTime = System.currentTimeMillis();
            outputFile = folder.getPath() + "/rec_" + startTime + ".mp3";
 
            myRecorder = new MediaRecorder();
 
            myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
            myRecorder.setOutputFile(outputFile);
            try {
                myRecorder.prepare();
                myRecorder.start();
 
                startTime = System.currentTimeMillis();
 
            } catch (Exception e) {
                e.printStackTrace();
            }
 
            runnable = new Runnable() {
                @Override
                public void run() {
                    if (onAudioRecordListener != null) {
                        onAudioRecordListener.changeAmplitude(getAmplitude());
                    }
                    handler.postDelayed(this, 100);
                }
            };
 
            handler.post(runnable);
        }
 
        private void stopRecord() {
            final long stopTime = System.currentTimeMillis();
            handler.removeCallbacks(runnable);
 
            try {
                if(System.currentTimeMillis() - startTime < 500){
                    try{
                        Thread.sleep(500);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
                myRecorder.stop();
                myRecorder.release();
                myRecorder = null;
            } catch (Exception e) {
                myRecorder = null;
                e.printStackTrace();
            }
 
            if (stopTime - startTime > 1000) {
                if (onAudioRecordCallback != null) {
                    onAudioRecordCallback.onComplete(outputFile);
                }
            } else {
                File current = new File(outputFile);
                current.delete();
                if (onAudioRecordCallback != null) {
                    onAudioRecordCallback.onFailed(2);
                }
            }
 
            isRunning = false;
        }
 
        @Override
        public void run() {
            startRecord();
            while (!isStop) {
                try {
                    Thread.sleep(30);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            stopRecord();
        }
 
        public void stopRecording() {
            isStop = true;
        }
 
        public boolean isRunning() {
            return isRunning;
        }
    }
 
}


Можно засетить ему 2 листенера, один будет уведомлять о результате записи аудио, другой во время записи будет непрерывно слать амплитуду (уровень шума).
Лежит на продакшене, вылетов не было.
2
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
18.05.2015, 17:08  [ТС] 11
А можно ли получать getmaxamplitude без записи файла?
(если постоянно это делать карта памяти наверное расплавится)
0
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
18.05.2015, 17:31 12
Если без записи в файл - пользуйтесь классом AudioRecorder, нужно будет на лету обробатывать входящие данные и извлекать из них инфу, далее можно данные затирать.
http://stackoverflow.com/questions/5...ecording-audio
2
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
02.06.2015, 12:36  [ТС] 13
Подскажите что выдает getSampleRate ()?
0
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
02.06.2015, 12:41 14
getSampleRate() returns the configured audio data sample rate in Hz
1
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
02.06.2015, 13:30  [ТС] 15
Спасибо, а в какой строчке должна быть Log.d(TAG, ""+audioRecord.getSampleRate());?
чтобы увидеть герцы в логах?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
 
public class MainActivity extends Activity {
 
* final String TAG = "myLogs";
 
* int myBufferSize = 8192;
* AudioRecord audioRecord;
* boolean isReading = false;
 
* @Override
* protected void onCreate(Bundle savedInstanceState) {
*** super.onCreate(savedInstanceState);
*** setContentView(R.layout.main);
 
*** createAudioRecorder();
 
*** Log.d(TAG, "init state = " + audioRecord.getState());
* }
* void createAudioRecorder() {
*** int sampleRate = 8000;
*** int channelConfig = AudioFormat.CHANNEL_IN_MONO;
*** int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
 
*** int minInternalBufferSize = AudioRecord.getMinBufferSize(sampleRate,
******* channelConfig, audioFormat);
*** int internalBufferSize = minInternalBufferSize * 4;
*** Log.d(TAG, "minInternalBufferSize = " + minInternalBufferSize
******* + ", internalBufferSize = " + internalBufferSize
******* + ", myBufferSize = " + myBufferSize);
 
*** audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
******* sampleRate, channelConfig, audioFormat, internalBufferSize);
 
*** audioRecord.setPositionNotificationPeriod(1000);
 
*** audioRecord.setNotificationMarkerPosition(10000);
*** audioRecord
******* .setRecordPositionUpdateListener(new OnRecordPositionUpdateListener() {
********* public void onPeriodicNotification(AudioRecord recorder) {
*********** Log.d(TAG, "onPeriodicNotification");
********* }
 
********* public void onMarkerReached(AudioRecord recorder) {
*********** Log.d(TAG, "onMarkerReached");
*********** isReading = false;
********* }
******* });
* }
public void recordStart(View v) {
*** Log.d(TAG, "record start");
*** audioRecord.startRecording();
*** int recordingState = audioRecord.getRecordingState();
*** Log.d(TAG, "recordingState = " + recordingState);
* }
 
* public void recordStop(View v) {
*** Log.d(TAG, "record stop");
*** audioRecord.stop();
* }
 
* public void readStart(View v) {
*** Log.d(TAG, "read start");
*** isReading = true;
*** new Thread(new Runnable() {
***** @Override
***** public void run() {
******* if (audioRecord == null)
********* return;
 
******* byte[] myBuffer = new byte[myBufferSize];
******* int readCount = 0;
******* int totalCount = 0;
******* while (isReading) {
********* readCount = audioRecord.read(myBuffer, 0, myBufferSize);
********* totalCount += readCount;
********* Log.d(TAG, "readCount = " + readCount + ", totalCount = "
************* + totalCount);
******* }
***** }
*** }).start();
* }
 
* public void readStop(View v) {
*** Log.d(TAG, "read stop");
*** isReading = false;
* }
 
* @Override
* protected void onDestroy() {
*** super.onDestroy();
 
*** isReading = false;
*** if (audioRecord != null) {
***** audioRecord.release();
*** }
* }
}
0
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
02.06.2015, 13:37 16
Вы же сами задаёте 8000, явно столько и будет. Вот урок на эту тему
1
androbro
02.06.2015, 13:41
  #17

Не по теме:

Gabberr,

Цитата Сообщение от Gabberr Посмотреть сообщение
Вот урок на эту тему
так код у товарища с этого урока и скопипастен))))

0
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
02.06.2015, 14:37  [ТС] 18
да, действительно, не правильно перевел configured audio data sample rate,
то есть он выдаст частоту с которой выполняется "замер" звука.

Добавлено через 42 минуты
Как можно в логи выводить значения массива myBuffer?
После строки 82 уже полученны 4096 значений?
(то есть в 83 строке их можно вывести в логи?)
0
Gabberr
104 / 104 / 19
Регистрация: 13.10.2009
Сообщений: 404
02.06.2015, 14:46 19
Да, после 82 сроки буфер уже не пустрой
Можно выводить так
Java
1
Log.i(Arrays.toString(myBuffer));
1
Valakin
434 / 100 / 15
Регистрация: 21.02.2015
Сообщений: 788
05.06.2015, 13:21  [ТС] 20
Спасибо,

readCount = audioRecord.read(myBuffer, 0, myBufferSize);

он всегда выдает новый myBuffer? (то есть возможно он ждет когда появятся новые данные?)
0
05.06.2015, 13:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2015, 13:21

Уровень шума на микрофоне
Хочу сделать как на гугл транслейте или дополнения Siri для iOS. Допустим...

Уровень шума Микрофона в ProgressBar
Немогу вывести (ProgresBar.Value = q;) значение переменной, вроди все так но не...

Реагирование программы на высокий уровень шума
Хочу сделать мини утилиту сидящая в трее и которая бы оповещала, звуком или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru