【问题标题】:MediaRecorder not saving audio to fileMediaRecorder 未将音频保存到文件
【发布时间】:2017-09-04 05:16:18
【问题描述】:

我正在尝试 Android 音频捕获示例 (https://developer.android.com/guide/topics/media/audio-capture.html),但它似乎不适用于三星 Galaxy S5(我测试过的唯一手机)。这是使用 API 级别 23。

音频文件确实是在磁盘上创建的,但它是一个 0 字节文件 - 这显然是不正确的。这让我相信MediaRecorder 的某些地方不正确。

另一方面,MediaRecorder 的 getMaxAmplitude 似乎正在工作 - 所以它确实可以使用麦克风。

我发现了很多关于 SO 的其他问题,但没有一个有答案。最近有人遇到这种情况吗?

【问题讨论】:

  • 你有必要的权限吗?
  • 我开启了录制音频和互联网权限。 @Ironman 今天会试一试。

标签: android audio mediarecorder android-mediarecorder


【解决方案1】:

我已经发布了所有内容的完整代码,所以你可以毫无问题地去做。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="68dp"
        android:layout_marginTop="50dp"
        android:text="Start Recording"
        />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button1"
        android:layout_marginTop="64dp"
        android:text="Stop Recording"
        />
</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener{


    private Button startButton;
    private Button stopButton;
    private MediaRecorder mediaRecorder;
    private File audioFile;

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

        startButton = (Button) findViewById(R.id.button1);
        startButton.setOnClickListener(this);
        startButton.setText("start");

        stopButton = (Button) findViewById(R.id.button2);
        stopButton.setOnClickListener(this);
        stopButton.setEnabled(false);
        stopButton.setText("stop");

        audioFile = new File(Environment.getExternalStorageDirectory(),
                "audio_test4.3gp");

    }

    private void resetRecorder() {
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setAudioEncodingBitRate(16);
        mediaRecorder.setAudioSamplingRate(44100);
        mediaRecorder.setOutputFile(audioFile.getAbsolutePath());

        try {
            mediaRecorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                mediaRecorder = new MediaRecorder();
                resetRecorder();
                mediaRecorder.start();

                startButton.setEnabled(false);
                stopButton.setEnabled(true);
                break;
            case R.id.button2:
                try {
                    mediaRecorder.stop();
                }catch (RuntimeException ex){

                }
                mediaRecorder.release();
                mediaRecorder = null;

                startButton.setEnabled(true);
                stopButton.setEnabled(false);
                break;
        }
    }

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

        if (mediaRecorder != null) {
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
        }
    }


}

ma​​nifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.softeng.audiorecording" >

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Android 设备监视器屏幕截图:

在我的 java 代码中看到我给它命名 audio_test4.3gp 并且在 ScreenShot 中有同名的文件,它的大小是 3104

【讨论】:

  • 问题是我没有在start 之前运行prepare。我希望在实际录制音频之前准备好MediaRecorder。移动 preparestart 似乎可以让它工作。
  • @UtkarshSinha 很高兴为您提供帮助。
  • @HarshadPansuriya 尝试运行它时发生此错误。 java.lang.IllegalStateException at android.media.MediaRecorder.start(Native Method) 请帮我解决它..
【解决方案2】:

我假设你使用的是手机而不是模拟器。

如果您在使用计算机上的文件资源管理器录制后立即尝试查找文件,您将无法在某些手机上看到它或看到它为零字节。

使用手机上的库存文件资源管理器查找文件,我相信你会找到它(除非你有一些例外)。

祝你好运。

【讨论】:

    【解决方案3】:

    这里有 MediaRecorder 的完整工作代码,试试这个

        //For Creating new File everytime
        private static int audioIndex = 0;
    
     public void startRecording()
     {
        ++audioIndex;
        Log.d("Index", audioIndex + "");
        Ask.on(RecordingActivity.this)
                .forPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO)
                .withRationales("Give Permissions")
                .when(new Ask.Permission() {
                    @Override
                    public void granted(List<String> permissions) {
    
    
                        PackageManager pmanager = RecordingActivity.this.getPackageManager();
                        if (pmanager.hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
    
    
                            mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
                            mFileName += "/eatthatfrog" + audioIndex + ".3gp";
                            Log.d("File", mFileName);
                            mediaRecorder = new MediaRecorder();
                            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                            mediaRecorder.setOutputFile(mFileName);
                            try {
                                mediaRecorder.prepare();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            mediaRecorder.start();
    
    
                            Log.d("Recording ", "True");
    
                        } else {
                            Toast.makeText(RecordingActivity.this, "This device doesn't have a mic!", Toast.LENGTH_LONG).show();
                        }
                    }
    
                    @Override
                    public void denied(List<String> permissions) {
                        Log.d("Permission Denied", permissions.toString());
                    }
                }).go();
    }
    
    
    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.stop:
                mediaRecorder.stop();
                mediaRecorder.reset();
                mediaRecorder.release();
                myChronometer.stop();
        }
    

    使用compile 'com.vistrav:ask:1.2' 获得运行时权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多