Как захватить звук с микрофона моего телефона Android - PullRequest
0 голосов
/ 16 июля 2011

Я написал простой код Android для захвата звука с моего мобильного телефона HTC HD Desire Android Mobile и записи его в аудиофайл на моей SD-карте.Мой код записал аудиофайл, но я не могу открыть файл.Я подозреваю, что формат аудио файла не правильный.

Это код, который я написал, с некоторыми пояснениями, как он работает.Я ценю любые советы о том, как отладить мой код.Спасибо.

Код

Класс записи имеет один метод, StartRecording (), который отвечает за захват звука с микрофона в течение 20 секунд.

package com.audio;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder.AudioSource;

public class Recorder {

    private short[] recordedAudioBuffer;
    private int bufferRead;

    public short[] startRecording() {

        int recorderBufferSize = AudioRecord.getMinBufferSize(8000,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT) * 2;

        AudioRecord recorder = new AudioRecord(AudioSource.DEFAULT, 8000,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                recorderBufferSize);

        recordedAudioBuffer = new short[recorderBufferSize];
        recorder.startRecording();

        bufferRead = recorder.read(recordedAudioBuffer, 0, recorderBufferSize);

        synchronized (this) {
            try {
                this.wait(20000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        recorder.stop();
        recorder.release();
        return recordedAudioBuffer;

    }

    public int getBufferRead() {
        return bufferRead;
    }
}

Я управляю кодом рекордера с помощью AudioRecorderActivity.Этот класс использует простой FileOutputStream, обернутый внутри BufferedOUtputStream, и записывает массив аудиобуфера с рекордера в файл.

    package com.audio;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;

public class AudioRecorderActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // create a file to dump the recording
        File f = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/test.raw");
        try {
            f.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Record audio
        Recorder recorderInstance = new Recorder();
        short[] recordedAudioBuffer = recorderInstance.startRecording();

        // Write the audio to the file
        BufferedOutputStream bufferedStreamInstance = null;

        try {
            bufferedStreamInstance = new BufferedOutputStream(
                    new FileOutputStream(f));
        } catch (FileNotFoundException e) {
            throw new IllegalStateException("Cannot Open File", e);
        }

        DataOutputStream dataOutputStreamInstance = new DataOutputStream(
                bufferedStreamInstance);

        try {
            for (int idxBuffer = 0; idxBuffer < recordedAudioBuffer.length; idxBuffer++) {
                dataOutputStreamInstance
                        .writeShort(recordedAudioBuffer[idxBuffer]);
            }
        } catch (IOException e) {
            throw new IllegalStateException(
                    "dataOutputStreamInstance.writeShort(curVal)");
        }

    }
}

И это мой манифест Android:

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011

Вы также можете использовать намерение, если не хотите реализовывать это в своем приложении

final Intent audioIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
            File audioFile = new File(Environment.getExternalStorageDirectory(), "videoTest.mp4");
            audioFileUri = Uri.fromFile(audioFile);
            audioIntent.putExtra(MediaStore.EXTRA_OUTPUT, audioFileUri);
            startActivityForResult(audioIntent, TAKE_AUDIO);

audioFileUri - это URI файла на SD-карте

0 голосов
/ 01 ноября 2011

Данные, полученные AudioRecord, состоят из образцов PCM. Это «сырая» форма звука. В приведенном выше примере вы получите 8000 16-битных (двухбайтовых) выборок в секунду. Запись этих данных в файл просто создает файл с этими необработанными данными.

То, что вы, вероятно, хотите, чтобы данные были в каком-то стандартном формате файлов, где они имеют какой-то заголовок и, возможно, некоторое сжатие (иначе кодирование).

Самый простой способ записать звук в известном формате - это использовать класс MediaRecorder. В документе для MediaRecorder есть короткий образец, который я не буду повторять здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...