Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
#1

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

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

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

Как установить Андроид на флешку? Android
Android Как работает библиотека в андроид студио, как ее подключить, чтобы она заработала в проекте?
Android Как получить уровень громкости звука?
Android Подскажите пожалуйста компилятор .java файлов на андроид, или то, что может заменить JDK
Как реализовать анимацию в андроид? Android
Android Как добавить версию андроид
Android Как получить уровень громкости на Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
danyasworld
4 / 4 / 1
Регистрация: 12.04.2015
Сообщений: 226
Завершенные тесты: 1
29.04.2015, 16:20     Как андроид может измерять уровень шума? #2
через микрофон.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
29.04.2015, 16:35  [ТС]     Как андроид может измерять уровень шума? #3
а потом по проводам, да?
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
29.04.2015, 16:41     Как андроид может измерять уровень шума? #4
Цитата Сообщение от Valakin Посмотреть сообщение
а потом по проводам, да?
а по вашему у андрюши уши что ли есть?
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
29.04.2015, 16:51  [ТС]     Как андроид может измерять уровень шума? #5
У андрюши? У андрюши все есть
Я верю в его светлое будущее,
микрофон чем не ухо? а камера-глаз, а динамик-язык.
Вы видели когда нить андрюшу без языка? я нет

нашел какой то метод .getMaxAmplitude();
буду пробовать, сам спросил сам ответил
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
29.04.2015, 16:56     Как андроид может измерять уровень шума? #6
Цитата Сообщение от Valakin Посмотреть сообщение
сам спросил сам ответил
какой вопрос такой и ответ
так то danyasworld на Ваш вопрос и ответил
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,637
Записей в блоге: 3
30.04.2015, 08:00     Как андроид может измерять уровень шума? #7
Цитата Сообщение от Valakin Посмотреть сообщение
сам спросил сам ответил
Чем ответ danyasworld не угодил?
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
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);
логи смогу выложить позже
danyasworld
4 / 4 / 1
Регистрация: 12.04.2015
Сообщений: 226
Завершенные тесты: 1
30.04.2015, 15:17     Как андроид может измерять уровень шума? #9
есть одно приложение для разработки под андроид, там есть куча интересных примеров. Там есть пример на запись звука (audio record вроде) и там реализован уровень громкости(показывается в процентах) посмотри, думаю тебе поможет.
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
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 листенера, один будет уведомлять о результате записи аудио, другой во время записи будет непрерывно слать амплитуду (уровень шума).
Лежит на продакшене, вылетов не было.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
18.05.2015, 17:08  [ТС]     Как андроид может измерять уровень шума? #11
А можно ли получать getmaxamplitude без записи файла?
(если постоянно это делать карта памяти наверное расплавится)
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
18.05.2015, 17:31     Как андроид может измерять уровень шума? #12
Если без записи в файл - пользуйтесь классом AudioRecorder, нужно будет на лету обробатывать входящие данные и извлекать из них инфу, далее можно данные затирать.
http://stackoverflow.com/questions/5...ecording-audio
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
02.06.2015, 12:36  [ТС]     Как андроид может измерять уровень шума? #13
Подскажите что выдает getSampleRate ()?
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
02.06.2015, 12:41     Как андроид может измерять уровень шума? #14
getSampleRate() returns the configured audio data sample rate in Hz
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
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();
*** }
* }
}
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
02.06.2015, 13:37     Как андроид может измерять уровень шума? #16
Вы же сами задаёте 8000, явно столько и будет. Вот урок на эту тему
androbro
02.06.2015, 13:41
  #17

Не по теме:

Gabberr,

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

Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
02.06.2015, 14:37  [ТС]     Как андроид может измерять уровень шума? #18
да, действительно, не правильно перевел configured audio data sample rate,
то есть он выдаст частоту с которой выполняется "замер" звука.

Добавлено через 42 минуты
Как можно в логи выводить значения массива myBuffer?
После строки 82 уже полученны 4096 значений?
(то есть в 83 строке их можно вывести в логи?)
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
02.06.2015, 14:46     Как андроид может измерять уровень шума? #19
Да, после 82 сроки буфер уже не пустрой
Можно выводить так
Java
1
Log.i(Arrays.toString(myBuffer));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2015, 13:21     Как андроид может измерять уровень шума?
Еще ссылки по теме:

JMonkeyEngine, как использовать на Андроид? Android
Android Микрофон. Оценить уровень шума
Android Как изучать андроид?
Как на новом планшете снести андроид и поставить нормальный виндовс, как минимум ХР Android
Android Андроид как пульт

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

Или воспользуйтесь поиском по форуму:
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
05.06.2015, 13:21  [ТС]     Как андроид может измерять уровень шума? #20
Спасибо,

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

он всегда выдает новый myBuffer? (то есть возможно он ждет когда появятся новые данные?)
Yandex
Объявления
05.06.2015, 13:21     Как андроид может измерять уровень шума?
Ответ Создать тему
Опции темы

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