запись звука с микрофона

Ответить
yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

запись звука с микрофона

Сообщение yura91 » 25 окт 2015, 14:47

Я записываю звук с микрофона сначала в буфер а потом в wav файл. Но в wav файл данные записываются некорректно. Подскажите в чем моя ошибка?? вот код

Код: Выделить всё

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class MainActivity extends Activity {

    final String TAG = "Func";

    int myBufferSize;
    AudioRecord audioRecord;
    boolean isReading = false;

    private short nChannels;
    private int sRate;
    private short mBitsPersample;
    private int mBufferSize;
    private int mAudioSource;
    private int aFormat;
    private int mPeriodInFrames;
    private byte[] myBuffer;
    private static final int TIMER_INTERVAL = 120;

    private RandomAccessFile randomAccessWriter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBitsPersample = 16;
        nChannels = 1;
        sRate = 44100;
        mPeriodInFrames = sRate * TIMER_INTERVAL / 1000;
        //myBufferSize = mPeriodInFrames * mBitsPersample / 8 * nChannels;
        //myBufferSize = 65400;
        createAudioRecorder();

        //String mRcordFilePath = Environment.getExternalStorageDirectory() + "/testwav.wav";

        //prepare(mRcordFilePath);

        Log.d(TAG, "init state = " + audioRecord.getState());
    }

    void createAudioRecorder() {
        int sampleRate = 44100;
        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);
        myBufferSize = internalBufferSize * 2;
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                sampleRate, channelConfig, audioFormat, internalBufferSize);
    }

    public void prepare(String filePath) {
        try {
            // nChannels = 1;
            //sRate = 44100;
            //mBitsPersample = 16;
            // write file header
            randomAccessWriter = new RandomAccessFile(filePath, "rw");
            //randomAccessWriter.setLength(0); // Set file length to 0, to prevent unexpected behavior in case the file already existed
            randomAccessWriter.setLength(0);
            randomAccessWriter.writeBytes("RIFF");
            randomAccessWriter.writeInt(0); // Final file size not known yet, write 0
            randomAccessWriter.writeBytes("WAVE");
            randomAccessWriter.writeBytes("fmt ");
            randomAccessWriter.writeInt(Integer.reverseBytes(16)); // Sub-chunk size, 16 for PCM
            randomAccessWriter.writeShort(Short.reverseBytes((short) 1)); // AudioFormat, 1 for PCM
            randomAccessWriter.writeShort(Short.reverseBytes(nChannels));// Number of channels, 1 for mono, 2 for stereo
            randomAccessWriter.writeInt(Integer.reverseBytes(sRate)); // Sample rate
            randomAccessWriter.writeInt(Integer.reverseBytes(sRate * nChannels * mBitsPersample / 8)); // Byte rate, SampleRate*NumberOfChannels*mBitsPersample/8
            randomAccessWriter.writeShort(Short.reverseBytes((short) (nChannels * mBitsPersample / 8))); // Block align, NumberOfChannels*mBitsPersample/8
            randomAccessWriter.writeShort(Short.reverseBytes(mBitsPersample)); // Bits per sample
            randomAccessWriter.writeBytes("data");
            //randomAccessWriter.seek(4); // Write size to RIFF header
            // randomAccessWriter.writeInt(Integer.reverseBytes(8236));
            //randomAccessWriter.seek(40); // Write size to Subchunk2Size field
            // randomAccessWriter.writeInt(Integer.reverseBytes(8192));
            //randomAccessWriter.writeInt(0); // Data chunk size not known yet, write 0

            myBuffer = new byte[mPeriodInFrames * mBitsPersample / 8 * nChannels];

        } catch (Exception e) {
            if (e.getMessage() != null) {
                Log.e(TAG, e.getMessage());
            } else {
                Log.e(TAG, "Unknown error occured in prepare()");
            }

        }
    }


    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() {
                audioRecord.startRecording();
                int recordingState = audioRecord.getRecordingState();

                if (audioRecord == null)
                    return;

                byte[] myBuffer = new byte[myBufferSize];
                int readCount = 0;
                int totalCount = 0;
                while (isReading) {
                    readCount = audioRecord.read(myBuffer, 0, myBuffer.length);
                    totalCount += readCount;
                    Log.d(TAG, "readCount = " + readCount);
                    Log.d(TAG, "totalCount = " + totalCount);
                    myBufferSize = totalCount;

                }
            }
        }).start();
        if (isReading == false) {
            String mRcordFilePath = Environment.getExternalStorageDirectory() + "/testwav.wav";

            prepare(mRcordFilePath);

            try {

                Log.d(TAG, "myBuffer" + myBuffer);

                Log.d(TAG, "myBuffer" + myBufferSize);
                randomAccessWriter.seek(4);
                randomAccessWriter.writeInt(Integer.reverseBytes(36 + myBufferSize));
                randomAccessWriter.seek(40);
                randomAccessWriter.writeInt(Integer.reverseBytes(myBufferSize));
                randomAccessWriter.write(myBuffer);
                randomAccessWriter.close();
            } catch (IOException e) {

                e.printStackTrace();
                Log.e(TAG, e.getMessage());
            }


        }
    }



    public void readStop(View v) {
        Log.d(TAG, "read stop");
        audioRecord.stop();
        isReading = false;


    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        isReading = false;
        if (audioRecord != null) {
            audioRecord.release();
        }
    }
}

Ответить