简体   繁体   English

AudioRecord总是创建失败

[英]AudioRecord always create failed

I've been having an issue with using AudioRecord for Android. 使用Android的AudioRecord时遇到问题。 I've read as much as I can find online about it, but I cannot seem to get a good initialization. 我已经在网上找到了尽可能多的资料,但是似乎无法获得很好的初始化。

My code to create an AudioRecord object is like this: 我创建AudioRecord对象的代码如下:

    int bufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    if (bufferSize < 4096)
        bufferSize = 4096;

    mBuffer = new short[bufferSize];
    audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize);

and I had acquired the correct permission: 并且我已经获得了正确的许可:

but whenever I run the app, it will show this error: 但是每当我运行该应用程序时,它将显示此错误:

08-12 11:56:05.669: E/AudioRecord(10689): Could not get audio input for record source 1 08-12 11:56:05.669:E / AudioRecord(10689):无法获取记录源1的音频输入

08-12 11:56:05.669: E/AudioRecord-JNI(10689): Error creating AudioRecord instance: initialization check failed. 08-12 11:56:05.669:E / AudioRecord-JNI(10689):创建AudioRecord实例时出错:初始化检查失败。

08-12 11:56:05.669: E/AudioRecord-Java(10689): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object. 08-12 11:56:05.669:E / AudioRecord-Java(10689):[android.media.AudioRecord]初始化本机AudioRecord对象时出现错误代码-20。


So here is what you have to do to record audio files in android. 因此,这是在Android中录制音频文件所要做的。 First you have to add some permissions to your Androidmanifest.xml file. 首先,您必须向您的Androidmanifest.xml文件添加一些权限。 The application needs to have the permission to write to external storage Audio recording for android 该应用程序需要具有写入外部存储的权限,适用于Android的录音

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

Next you have to import the required classes and functions 接下来,您必须导入所需的类和函数

import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;

import java.io.IOException;

Create an instance of the Android.media.MediaRecorder. 创建一个Android.media.MediaRecorder的实例。

private void startRecording() {

 mRecorder = new MediaRecorder();

Next you have to set the source for the audio input, in most of the cases you would be using the MIC of your android device to give audio input to your application for recording audio files in android. 接下来,您必须设置音频输入的源,在大多数情况下,您将使用android设备的MIC将音频输入提供给应用程序,以便在android中记录音频文件。 In this case you would have to set audio source to : MediaRecorder.AudioSource.MIC 在这种情况下,您必须将音频源设置为:MediaRecorder.AudioSource.MIC

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

Next you have to define the output format for your recorder file. 接下来,您必须定义记录器文件的输出格式。 Android supports a variety for formats for audio. Android支持多种音频格式。 For this you have to use MediaRecorder.SetOutputFormat(); 为此,您必须使用MediaRecorder.SetOutputFormat();。 function. 功能。

 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

Now you have to name a file which will hold your audio recording in your specified format. 现在,您必须命名一个文件,该文件将以您指定的格式保存录音。 For that you have to use MediaRecorder.SetOutputfile() function. 为此,您必须使用MediaRecorder.SetOutputfile()函数。

mRecorder.setOutputFile(mFileName);

Now set the audio encoder using MediaRecorder.setAudioEncoder() function. 现在,使用MediaRecorder.setAudioEncoder()函数设置音频编码器。

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

To preapre your application for recording the audio input call MediaRecorder.prepare() 要准备录制音频输入的应用程序,请调用MediaRecorder.prepare()

 mPlayer.prepare();
            mPlayer.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }

Now everything is set up and ready, all you have to do is initiate the audio capturing process. 现在一切都已准备就绪,您要做的就是启动音频捕获过程。 For that you will have to do this: MediaRecorder.start(); 为此,您将必须执行以下操作:MediaRecorder.start();

class RecordButton extends Button {
        boolean mStartRecording = true;

        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onRecord(mStartRecording);
                if (mStartRecording) {
                    setText("Stop recording");
                } else {
                    setText("Start recording");
                }
                mStartRecording = !mStartRecording;
            }
        };

        public RecordButton(Context ctx) {
            super(ctx);
            setText("Start recording");
            setOnClickListener(clicker);
        }
    }

To stop the recording, call MediaRecorder.stop() At the end, when you are done with recording you have to release the resources byt calling MediaRecorder.release() 要停止录制,请调用MediaRecorder.stop()最后,完成录制后,您必须通过调用MediaRecorder.release()释放资源。

mPlayer.release();

Below is an example of application that records an audio and then plays it back. 下面是一个录制音频然后播放的应用程序示例。

package com.android.audiorecordtest;

import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;

import java.io.IOException;

public class AudioRecordTest extends Activity
{
    private static final String LOG_TAG = "AudioRecordTest";
    private static String mFileName = null;

    private RecordButton mRecordButton = null;
    private MediaRecorder mRecorder = null;

    private PlayButton   mPlayButton = null;
    private MediaPlayer   mPlayer = null;

    private void onRecord(boolean start) {
        if (start) {
            startRecording();
        } else {
            stopRecording();
        }
    }

    private void onPlay(boolean start) {
        if (start) {
            startPlaying();
        } else {
            stopPlaying();
        }
    }

    private void startPlaying() {
        mPlayer = new MediaPlayer();
        try {
            mPlayer.setDataSource(mFileName);
            mPlayer.prepare();
            mPlayer.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }

    private void stopPlaying() {
        mPlayer.release();
        mPlayer = null;
    }

    private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }

    private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }

    class RecordButton extends Button {
        boolean mStartRecording = true;

        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onRecord(mStartRecording);
                if (mStartRecording) {
                    setText("Stop recording");
                } else {
                    setText("Start recording");
                }
                mStartRecording = !mStartRecording;
            }
        };

        public RecordButton(Context ctx) {
            super(ctx);
            setText("Start recording");
            setOnClickListener(clicker);
        }
    }

    class PlayButton extends Button {
        boolean mStartPlaying = true;

        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onPlay(mStartPlaying);
                if (mStartPlaying) {
                    setText("Stop playing");
                } else {
                    setText("Start playing");
                }
                mStartPlaying = !mStartPlaying;
            }
        };

        public PlayButton(Context ctx) {
            super(ctx);
            setText("Start playing");
            setOnClickListener(clicker);
        }
    }

    public AudioRecordTest() {
        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/audiorecordtest.3gp";
    }

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        LinearLayout ll = new LinearLayout(this);
        mRecordButton = new RecordButton(this);
        ll.addView(mRecordButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        mPlayButton = new PlayButton(this);
        ll.addView(mPlayButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        setContentView(ll);
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mRecorder != null) {
            mRecorder.release();
            mRecorder = null;
        }

        if (mPlayer != null) {
            mPlayer.release();
            mPlayer = null;
        }
    }
}

or use this amazing tutorial 或使用这个惊人的教程

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android AudioRecord初始化失败 - Android AudioRecord initialization failed AudioRecord并不总是录制预期的内容 - AudioRecord not always recording what expected Android AudioRecord-本机初始化失败 - Android AudioRecord - native init failed AudioFlinger 无法创建记录轨道,状态:-1 创建 AudioRecord 实例时出错:初始化检查失败,状态为 -1 - AudioFlinger could not create record track, status: -1 Error creating AudioRecord instance: initialization check failed with status -1 使用AudioRecord.read并始终获取具有最大振幅的缓冲区 - Using AudioRecord.read and always getting buffer with maximum amplitudes Android AudioRecord read总是返回-3(ERROR_INVALID_OPERATION) - Android AudioRecord read always returns -3 (ERROR_INVALID_OPERATION) Android - 无法为所有可能的参数组合初始化AudioRecord - Android - Failed to Initialize an AudioRecord for All Possible Combinations of Arguments 交叉关联:Android AudioRecord为TDoA创建示例数据 - Cross Correlation: Android AudioRecord create sample data for TDoA E / AudioRecord:AudioFlinger无法创建记录轨道,状态:-1 - E/AudioRecord: AudioFlinger could not create record track, status: -1 如何在audioRecord和audioTrack之间创建延迟 - How can I create delay between audioRecord and audioTrack
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM