当前位置: 首页 > 知识库问答 >
问题:

Android录制麦克风到ByteArray,无需保存音频文件

戚锦
2023-03-14

对不起我的英语不好:(

我开始我的android应用程序项目,这个应用程序录制麦克风,如果我点击开始录制按钮,应用程序获取麦克风并将其写入文件,当我点击停止时,一个文件保存到SD卡中。

项目代码:

输出文件

OUTPUT_FILE = Environment.getExternalStorageState() + "/myaudio.3gp";

开始录音

public void startRecord() throws IOException{
    if (recorder != null)
    {
        recorder.release();
    }
    File outFile = new File(OUTPUT_FILE);
    if (outFile.exists())
    {
        outFile.delete();
    }

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFormat(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(OUTPUT_FILE);
    recorder.prepare();
    recorder.start();
}

停止录制

public void stopRec(){
    recorder.stop();
}

播放声音录制文件

public void playRecFile() throws IOException{
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setDataSource(OUTPUT_FILE);
    mediaPlayer.prepare();
    mediaPlayer.start();

}

我想录下声音并将其放入变量ByteArray中,在不将音频文件保存到SD卡的情况下播放

我有一个像我想要的项目,但它是用actionscript 3编写的

import flash.media.*;
import flash.events.*;
import flash.utils.ByteArray;

var ch:SoundChannel
var mic:Microphone = Microphone.getMicrophone();

mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);
mic.addEventListener(ActivityEvent.ACTIVITY,onAct);

function onAct(evt:ActivityEvent):void
{
    trace(evt.activating,mic.activityLevel);
    if (!evt.activating)
    {
        if (soundBytes.length)
        {
            timerHandler();
        }
    }
}

var soundBytes:ByteArray = new ByteArray();
var soundO:ByteArray = new ByteArray();

function micSampleDataHandler(event:SampleDataEvent):void
{
    trace(event.data.length,event.data.bytesAvailable, soundBytes.length);
    while (event.data.bytesAvailable)
    {
        var sample:Number = event.data.readFloat();
        soundBytes.writeFloat(sample);
    }
}

function timerHandler():void
{
    mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);
    soundBytes.position = 0;
    soundO.writeBytes(soundBytes);
    soundO.position = 0;
    soundBytes.position = 0;
    soundBytes.length=0;

    var sound:Sound= new Sound();
    sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler);
    ch=sound.play();
    ch.addEventListener(Event.SOUND_COMPLETE,onSC)
    trace("OUTPUT",soundO.bytesAvailable);

}
function onSC(evt:Event):void
{
    trace("SOUND_COMPLETE");
}
function playbackSampleHandler(event:SampleDataEvent):void
{
    trace("SAMPLE_DATA: ",soundO.bytesAvailable)
    for (var i:int = 0; i < 8192; i++)
    {
        if (soundO.bytesAvailable < 4)
        {
         break;
        }
        var sample:Number = soundO.readFloat();
        event.data.writeFloat(sample);
        event.data.writeFloat(sample);      
    }
    if (soundO.bytesAvailable < 4 && soundO.position!==0)
    {
        mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);
        soundO.position=0
        soundO.length = 0;

        trace("END
    }
}

共有3个答案

苏鹏鹍
2023-03-14

我想录下声音并将其放入变量ByteArray中,在不将音频文件保存到SD卡的情况下播放

使用AudioRecord类将麦克风中的音频捕获到阵列中,然后将其馈送到AudioTrack中。

关浩壤
2023-03-14

使用以下类获取记录的Mic数据作为字节数组。你会将数据作为缓冲区。试着使用它。希望这对你有帮助。。

class AudioRecordThread implements Runnable {
        @Override
        public void run() {
            int bufferLength = 0;
            int bufferSize;
            short[] audioData;
            int bufferReadResult;

            try {
                bufferSize = AudioRecord.getMinBufferSize(sampleAudioBitRate, 
                        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);

                if (bufferSize <= 2048) {
                    bufferLength = 2048;
                } else if (bufferSize <= 4096) {
                    bufferLength = 4096;
                }

                /* set audio recorder parameters, and start recording */
                audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleAudioBitRate, 
                        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferLength);
                audioData = new short[bufferLength];
                audioRecord.startRecording();
                Log.d(LOG_TAG, "audioRecord.startRecording()");

                isAudioRecording = true;

                /* ffmpeg_audio encoding loop */
                while (isAudioRecording) {
                    bufferReadResult = audioRecord.read(audioData, 0, audioData.length);

                    if (bufferReadResult == 1024 && isRecorderStart) {
                        Buffer realAudioData1024 = ShortBuffer.wrap(audioData,0,1024);

                    *********************************** 
                        recorder.record(realAudioData1024);
                        ***********************************

                    } else if (bufferReadResult == 2048 && isRecorderStart) {
                        Buffer realAudioData2048_1=ShortBuffer.wrap(audioData, 0, 1024);
                        Buffer realAudioData2048_2=ShortBuffer.wrap(audioData, 1024, 1024);
                        for (int i = 0; i < 2; i++) {
                            if (i == 0) {
        ***********************************                     
        recorder.record(realAudioData2048_1);
        ***********************************                      

                            } else if (i == 1) {
***********************************
recorder.record(realAudioData2048_2);
***********************************


                            }
                        }
                    }
                }

                /* encoding finish, release recorder */
                if (audioRecord != null) {
                    try {
                        audioRecord.stop();
                        audioRecord.release();

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    audioRecord = null;
                }

                if (recorder != null && isRecorderStart) {
                    try {
                        recorder.stop();
                        recorder.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    recorder = null;
                }
            } catch (Exception e) {
                Log.e(LOG_TAG, "get audio data failed:"+e.getMessage()+e.getCause()+e.toString());
            }

        }
    }
经正祥
2023-03-14

尝试使用以下解决方案,使用MediaRecorder将音频录制到字节阵列:

    // Byte array for audio record
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    ParcelFileDescriptor[] descriptors = ParcelFileDescriptor.createPipe();
    ParcelFileDescriptor parcelRead = new ParcelFileDescriptor(descriptors[0]);
    ParcelFileDescriptor parcelWrite = new ParcelFileDescriptor(descriptors[1]);

    InputStream inputStream = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead);

    MediaRecorder recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(parcelWrite.getFileDescriptor());
    recorder.prepare();

    recorder.start();


    int read;
    byte[] data = new byte[16384];

    while ((read = inputStream.read(data, 0, data.length)) != -1) {
        byteArrayOutputStream.write(data, 0, read);
    }

    byteArrayOutputStream.flush();

我将此代码包装在AsyncTask中以开始执行。

此外,不要忘记运行以下代码来停止录制:

    recorder.stop();
    recorder.reset();
    recorder.release();

要将byteArrayOutputStream转换为字节[],请使用byteArrayOutputStream.toByteArray()

 类似资料:
  • 在遵循类似的教程之后,我正在使用MediaRecorder类用相机录制视频 http://androidcookbook.com/Recipe.seam;jsessionid=40151FCD26222877E151C3EEFB406EED?recipeId=1375 我希望在录音时能够使麦克风静音/取消静音。怎么可能呢? 我正在开始设置音频源 但是如果我想在某个时候录制没有声音的音乐呢?

  • 我正在尝试通过camera2 api录制我自己,同时观看视频。我想录制视频配乐,用麦克风音源录制表面。 我如何创建两个音轨,第一个为呈现给用户的视频,第二个为mediaRecorder AudioSource.mic

  • 问题内容: 我正在寻找一种将文件中的音频数据馈送到麦克风的方法,因此,当第三方应用程序(例如 arecord 或Chromium的“按语音搜索”功能)使用麦克风进行音频输入时,它们会从文件中接收音频数据代替。 这是我的情况 :我编写的一个应用程序记录了来自麦克风的音频数据(使用ALSA)并将其保存到文件(audioFile0.raw)中。在将来的某个未知时间点,某些未知的第三方应用程序(例如,我没

  • 问题内容: 我正在开发一个录音应用程序。在其中,我有一个Seekbar来更改输入语音增益。我找不到任何调整输入语音增益的方法。 我正在上课来录制声音。 我已经在Google Play商店中 看到了使用此功能的应用程序。 问题答案: 据我了解,您不需要任何自动调整,只需从用户界面进行手动调整即可。Android中没有内置功能,因此您必须手动修改数据。 假设您使用read(short [] audio

  • 我设法通过电话麦克风录制声音,并在电话扬声器或耳机上听到它。但是当耳机有麦克风时,通常是免提的,默认情况下它使用免提麦克风录制声音。我需要以某种方式静音免提麦克风和使用电话麦克风。在Android系统中可能吗? 我还没找到任何答案。在android开发人员中,Stackoverflow一事无成。提前感谢!

  • 我正在尝试从麦克风录制,添加一些效果,并将其保存到文件中 我已经从AndroidNDK中包含的本地音频示例开始。我设法添加了一些混响并播放它,但我没有找到任何关于如何完成此操作的示例或帮助。 任何帮助都是受欢迎的。