Запись аудио с помощью AudioRecord в Android - PullRequest
0 голосов
/ 19 июля 2011

Из приведенного ниже кода я могу создать файл test.pcm, но не могу воспроизвести его на мобильном телефоне или компьютере.

Я также устал от test.mp3, test.wav и test.raw.У меня есть тост, что плеер не поддерживает этот тип файла.

Кто-нибудь знает, как я могу воспроизвести файл, записанный мной с помощью AudioRecord?

Используя приведенный ниже код, я получаю массив коротких данных с микрофона и записываю его в SdCard.

Вот код:

package com.anroid.AudioProcess;

import java.io.File;

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

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.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;


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

        // Record 20 seconds of audio.
        Recorder recorderInstance = new Recorder();
        Thread th = new Thread(recorderInstance);
        recorderInstance.setFileName(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test.pcm"));
        th.start();
        recorderInstance.setRecording(true);
        synchronized (this) {
        try {
            this.wait(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        }
        recorderInstance.setRecording(false);
        try {
            th.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }
}





 class Recorder implements Runnable {
    private int frequency;
    private int channelConfiguration;
    private volatile boolean isPaused;
    private File fileName;
    private volatile boolean isRecording;
    private final Object mutex = new Object();

    // Changing the sample resolution changes sample type. byte vs. short.
    private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

    /**
     * 
     */
    public Recorder() {
        super();
        this.setFrequency(11025);
        this.setChannelConfiguration(AudioFormat.CHANNEL_CONFIGURATION_MONO);
        this.setPaused(false);
    }

    public void run() {
        // Wait until we're recording...
        synchronized (mutex) {
            while (!this.isRecording) {
                try {
                    mutex.wait();
                } catch (InterruptedException e) {
                    throw new IllegalStateException("Wait() interrupted!", e);
                }
            }
        }

        // Open output stream...
        if (this.fileName == null) {
            throw new IllegalStateException("fileName is null");
        }
        BufferedOutputStream bufferedStreamInstance = null;
        if (fileName.exists()) {
            fileName.delete();
        }
        try {
            fileName.createNewFile();
        } catch (IOException e) {
            throw new IllegalStateException("Cannot create file: " + fileName.toString());
        }
        try {
            bufferedStreamInstance = new BufferedOutputStream(
                    new FileOutputStream(this.fileName));
        } catch (FileNotFoundException e) {
            throw new IllegalStateException("Cannot Open File", e);
        }
        DataOutputStream dataOutputStreamInstance = 
            new DataOutputStream(bufferedStreamInstance);

        // We're important...
        android.os.Process
                .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

        // Allocate Recorder and Start Recording...
        int bufferRead = 0;
        int bufferSize = AudioRecord.getMinBufferSize(this.getFrequency(),
                this.getChannelConfiguration(), this.getAudioEncoding());
        AudioRecord recordInstance = new AudioRecord(
                MediaRecorder.AudioSource.MIC, this.getFrequency(), this
                        .getChannelConfiguration(), this.getAudioEncoding(),
                bufferSize);
        short[] tempBuffer = new short[bufferSize];
        recordInstance.startRecording();
        while (this.isRecording) {
            // Are we paused?
            synchronized (mutex) {
                if (this.isPaused) {
                    try {
                        mutex.wait(250);
                    } catch (InterruptedException e) {
                        throw new IllegalStateException("Wait() interrupted!",
                                e);
                    }
                    continue;
                }
            }

            bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
            if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
                throw new IllegalStateException(
                        "read() returned AudioRecord.ERROR_INVALID_OPERATION");
            } else if (bufferRead == AudioRecord.ERROR_BAD_VALUE) {
                throw new IllegalStateException(
                        "read() returned AudioRecord.ERROR_BAD_VALUE");
            } else if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
                throw new IllegalStateException(
                        "read() returned AudioRecord.ERROR_INVALID_OPERATION");
            }
            try {
                for (int idxBuffer = 0; idxBuffer < bufferRead; ++idxBuffer) {
                    dataOutputStreamInstance.writeShort(tempBuffer[idxBuffer]);
                }
            } catch (IOException e) {
                throw new IllegalStateException(
                    "dataOutputStreamInstance.writeShort(curVal)");
            }

        }

        // Close resources...
        recordInstance.stop();
        try {
            bufferedStreamInstance.close();
        } catch (IOException e) {
            throw new IllegalStateException("Cannot close buffered writer.");
        }
    }

    public void setFileName(File fileName) {
        this.fileName = fileName;
    }

    public File getFileName() {
        return fileName;
    }

    /**
     * @param isRecording
     *            the isRecording to set
     */
    public void setRecording(boolean isRecording) {
        synchronized (mutex) {
            this.isRecording = isRecording;
            if (this.isRecording) {
                mutex.notify();
            }
        }
    }

    /**
     * @return the isRecording
     */
    public boolean isRecording() {
        synchronized (mutex) {
            return isRecording;
        }
    }

    /**
     * @param frequency
     *            the frequency to set
     */
    public void setFrequency(int frequency) {
        this.frequency = frequency;
    }

    /**
     * @return the frequency
     */
    public int getFrequency() {
        return frequency;
    }

    /**
     * @param channelConfiguration
     *            the channelConfiguration to set
     */
    public void setChannelConfiguration(int channelConfiguration) {
        this.channelConfiguration = channelConfiguration;
    }

    /**
     * @return the channelConfiguration
     */
    public int getChannelConfiguration() {
        return channelConfiguration;
    }

    /**
     * @return the audioEncoding
     */
    public int getAudioEncoding() {
        return audioEncoding;
    }

    /**
     * @param isPaused
     *            the isPaused to set
     */
    public void setPaused(boolean isPaused) {
        synchronized (mutex) {
            this.isPaused = isPaused;
        }
    }

    /**
     * @return the isPaused
     */
    public boolean isPaused() {
        synchronized (mutex) {
            return isPaused;
        }
    }

}

Ответы [ 3 ]

1 голос
/ 01 октября 2012

MediaRecorder ваша потребность здесь. Если вы не планируете возиться с необработанными аудиоданными, используйте объект MediaRecorder для записи. Установите выходной формат THREE_GPP, и он должен работать для вас.

1 голос
/ 12 июня 2013

Изменение расширения файла не меняет формат файла, поэтому, например, установка .mp3 не приводит к автоматическому созданию файла MP3. AudioRecord создает необработанные данные PCM.

Вы должны будете указать медиаплееру воспроизводить сырой файл и какие данные ожидать (частоту дискретизации, кодирование и т. Д.) Так же, как вы это делали при записи, поскольку эта информация не предоставляется самим файлом .

Вы можете прочитать инструкции для этого в Audacity здесь: http://delog.wordpress.com/2011/03/25/playing-raw-pcm-audio-using-audacity/

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

Думаю, вам следует использовать другой класс, а не AudioRecord. AudioRecord - это сырые цифровые впечатления о том, что сейчас у вас на звуковом порте. А то, что вы «позаимствовали» там для кода, это просто последовательность чисел.

Попробуйте использовать AudioManager, подумайте, что больше подходит вашему стилю.

...