繁体   English   中英

如何从我的 Android 电话麦克风中捕获音频

[英]How to Capture Audio from My Android Phone Microphone

我编写了一个简单的 Android 代码来从我的 HTC HD Desire Android 手机中捕获音频,并将其写入我 SD 卡上的音频文件中。 我的代码编写了音频文件,但我无法打开该文件。 我怀疑音频文件格式不对。

这是我编写的代码,并解释了它是如何工作的。 我感谢有关如何调试我的代码的任何提示。 谢谢你。

代码

录音机 class 有一种方法 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 驱动录音机代码。 此 class 使用包装在 BufferedOUTputStream 中的简单 FileOutputStream,并将录音机中的音频缓冲区数组写入文件。

    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 清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.audio"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AudioRecorderActivity"
                  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>

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

AudioRecord 产生的数据由 PCM 样本组成。 这是声音的“原始”形式。 在上面的示例中,您每秒将获得 8,000 个 16 位(两个字节)样本。 将此数据写入文件只会使用此原始数据创建一个文件。

您可能想要的是数据采用某种标准文件格式,其中它具有某种 header,可能还有一些压缩(也称为编码)。

以已知格式录制音频的最简单方法是使用 MediaRecorder class。 MediaRecorder 的文档有一个简短的示例,我不会在这里重复。

如果您不想在您的应用程序上实现它,您也可以使用意图

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 是 SD 卡中文件的 uri

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM