2013-01-06 73 views
24

Sử dụng MediaRecorder Tôi chụp âm thanh từ micrô của thiết bị. Từ âm thanh tôi nhận được tôi cần chỉ để phân tích âm lượng âm thanh (âm thanh lớn), mà không lưu âm thanh vào một tập tin.android: Phát hiện mức âm thanh

Hai câu hỏi:

  1. Làm thế nào để tôi có được độ to cho âm thanh tại một thời điểm nào trong thời gian?
  2. Làm cách nào để phân tích mà không lưu âm thanh vào tệp?

Cảm ơn bạn.

Trả lời

35
  1. Sử dụng mRecorder.getMaxAmplitude();

  2. Đối với việc phân tích các âm thanh mà không lưu tất cả các bạn cần là sử dụng mRecorder.setOutputFile("/dev/null");

Here's Ví dụ, tôi hy vọng điều này sẽ giúp

public class SoundMeter { 

    private MediaRecorder mRecorder = null; 

    public void start() { 
      if (mRecorder == null) { 
        mRecorder = new MediaRecorder(); 
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
        mRecorder.setOutputFile("/dev/null"); 
        mRecorder.prepare(); 
        mRecorder.start(); 
      } 
    } 

    public void stop() { 
      if (mRecorder != null) { 
        mRecorder.stop();  
        mRecorder.release(); 
        mRecorder = null; 
      } 
    } 

    public double getAmplitude() { 
      if (mRecorder != null) 
        return mRecorder.getMaxAmplitude(); 
      else 
        return 0; 

    } 
} 
+1

Tôi thích/dev/null, nhưng tôi không hiểu cách lấy MaxAmplitude vài lần mỗi giây. –

+1

Tôi cần liên tục ghi lại mức âm thanh (100 lần mỗi giây). Mức âm thanh được ghi lại (độ lớn) phải từ thời điểm tôi ghi lại. –

+0

Tôi đã giải quyết. Trả về getMaxAmplitude() được giải thích như thế này trên trang web phát triển android: biên độ tuyệt đối tối đa được đo kể từ lần gọi cuối cùng hoặc 0 khi được gọi lần đầu tiên và để nhận bất kỳ giây nào giá trị này tôi đã sử dụng Bộ hẹn giờ. –

3

Tôi chơi xung quanh với một vài ứng dụng mã nguồn âm thanh ghi âm nhưng nó để ok một lúc để có được nó.

Bạn có thể sao chép mã nguồn NoiseAlert của Google - mã SoundMeter, là mã tôi đã sử dụng.

getMaxMức độ dao động từ 0 đến 32768. Công cụ EMA tôi không bận tâm khi sử dụng.

Trong hoạt động chính của mình, bạn phải khai báo đối tượng MediaRecorder và gọi hàm start() của nó là Anna được trích dẫn.

Để biết thêm thông tin, bạn có thể tham khảo dự án của tôi: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-i-e-how-to-transmit-send-data-from-android-to-arduino-bluesmirf-silver-using-bluetooth/ Nơi tôi cần gửi giá trị biên độ âm thanh trên BlueTooth.

mã chính xác là ở đây: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

Chỉ cần lướt qua những phần mà có bất cứ điều gì để làm với các đối tượng liên quan đến MediaRecorder.

+0

Trang web http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send-data-from-android-to-arduino- bluesmirf-bạc-sử dụng-bluetooth là "không còn có sẵn" theo Wordpress. –

6

Nếu bạn muốn phân tích một mẫu âm thanh lấy trực tiếp từ micro mà không lưu dữ liệu trong một tập tin, bạn cần phải tận dụng các đối tượng AudioRecord như sau:

int sampleRate = 8000; 
try { 
    bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO, 
     AudioFormat.ENCODING_PCM_16BIT); 
    audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, bufferSize); 
} catch (Exception e) { 
    android.util.Log.e("TrackingFlow", "Exception", e); 
} 

Sau đó, bạn phải bắt đầu ghi âm khi đã sẵn sàng:

audio.startRecording(); 

Bây giờ là lúc để bắt đầu mẫu đọc như sau:

short[] buffer = new short[bufferSize]; 

    int bufferReadResult = 1; 

    if (audio != null) { 

     // Sense the voice... 
     bufferReadResult = audio.read(buffer, 0, bufferSize); 
     double sumLevel = 0; 
     for (int i = 0; i < bufferReadResult; i++) { 
      sumLevel += buffer[i]; 
     } 
     lastLevel = Math.abs((sumLevel/bufferReadResult)); 

Mã cuối cùng kết hợp tất cả các biên độ mẫu khác nhau và gán giá trị trung bình cho biến lastLeveL, để biết thêm chi tiết, bạn có thể truy cập vào số post này.

Trân trọng!

+0

Thuật toán này bị hỏng - bạn không thể thêm các giá trị như vậy vì đây là các giá trị đã ký. Bạn phải lấy * magnitudes * và trung bình. –

+0

@Martin: Có phải "lastLevel" là MaxAmplitude không ?? Trên thực tế tôi cần phải tính toán giá trị 'dbValue' và 'MeanLevelTotal', và tôi không sử dụng tệp đã được sắp xếp trước. Tôi đang làm việc để ghi hình trực tiếp. –

Các vấn đề liên quan