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

Android:-将录制的音频文件转换为浮动数组

方子安
2023-03-14

我正在做一个简单的Android应用程序,我从智能手机麦克风录制一些东西,保存在一个文件中,然后播放该文件。

现在我想对音频文件应用高通滤波器,但要做到这一点,我需要首先将音频文件转换为浮点数组。谁能帮我一下吗。

谢谢

package abc.com.please;

import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

private static MediaRecorder mediaRecorder = new MediaRecorder();
private static MediaPlayer mediaPlayer;

private static String audioFilePath;
private static Button stopButton;
private static Button playButton;
private static Button recordButton;

private boolean isRecording = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recordButton = (Button) findViewById(R.id.recordButton);
    playButton = (Button) findViewById(R.id.playButton);
    stopButton = (Button) findViewById(R.id.stopButton);

    if (!hasMicrophone())
    {
        stopButton.setEnabled(false);
        playButton.setEnabled(false);
        recordButton.setEnabled(false);
    } else {
        playButton.setEnabled(false);
        stopButton.setEnabled(false);
    }

    audioFilePath =
            Environment.getExternalStorageDirectory().getAbsolutePath()
                    + "/myaudio.3gp";


    recordButton.setOnClickListener(new View.OnClickListener(){

        public void onClick (View v)
        {

            isRecording = true;
            stopButton.setEnabled(true);
            playButton.setEnabled(false);
            recordButton.setEnabled(false);

            try {
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                                   mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mediaRecorder.setOutputFile(audioFilePath);
                  mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.prepare();
                mediaRecorder.start();
            }catch (Exception e) {
                e.printStackTrace();

            }



        }
    });

    stopButton.setOnClickListener(new View.OnClickListener() {
        public void onClick (View view)
        {

            stopButton.setEnabled(false);
            playButton.setEnabled(true);
            if (isRecording)
            {
                recordButton.setEnabled(false);
                isRecording = false;
                mediaRecorder.stop();
                mediaRecorder.release();
                recordButton.setEnabled(true);
            }
            else
            {
                Toast.makeText(getApplicationContext(),"No recording going      on",Toast.LENGTH_SHORT).show();
            }
        }});

    playButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view)

        {

            playButton.setEnabled(false);
            recordButton.setEnabled(false);
            stopButton.setEnabled(true);
            try {
                mediaPlayer = new MediaPlayer();
                mediaPlayer.setDataSource(audioFilePath);
                mediaPlayer.prepare();
                mediaPlayer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
}

protected boolean hasMicrophone() {
    PackageManager pmanager = this.getPackageManager();
    return pmanager.hasSystemFeature(
            PackageManager.FEATURE_MICROPHONE);
}








}

共有1个答案

宓文斌
2023-03-14

字节到浮点数转换的细节将取决于您用于音频文件的文件格式。我无法从您的代码中分辨出该格式。如果您的文件是WAV、44100 fps、16位、小端、立体声(这是标准的Java、“光盘质量”格式),您可以尝试使用我写的以下代码。关键的转换点是当两个字节串联并转换为单个数字时(其中“缓冲区”包含从音频文件读取的html" target="_blank">数据:

float audioVal = ( buffer[bufferIdx++] & 0xff )
                        | ( buffer[bufferIdx++] << 8 );

如果是big endian,则颠倒移位顺序。如果是24位或32位,那么您将

我一直在Java上下文中使用以下内容一段时间没有问题,但我不知道Android是否支持javax.sound.sampled.AudioInputStream等。也许在文件读取的上下文中查看转换仍然有用?代码假设我们有“CD质量”音频格式,并且音频文件不长于整数。最大帧数。

public float[] loadSoundFileURL(URL url) throws UnsupportedAudioFileException,
        IOException
{
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);

    int framesCount = (int)ais.getFrameLength();

    // assuming stereo format, so two entries per frame
    float[] temp = new float[framesCount * 2];
    long tempCountdown = temp.length;

    int bytesRead = 0;
    int bufferIdx;
    int clipIdx = 0;
    byte[] buffer = new byte[1024];
    while((bytesRead = ais.read(buffer, 0, 1024)) != -1)
    {
        bufferIdx = 0;
        for (int i = 0, n = (bytesRead >> 1); i < n; i ++)
        {
            if ( tempCountdown-- >= 0)
            {
                temp[clipIdx++] = 
                        ( buffer[bufferIdx++] & 0xff )
                        | ( buffer[bufferIdx++] << 8 ) ;
            }
        }
    }

    // QUESTION: better to do following in above loop?
    for (int i = 0; i < temp.length; i++)
    {
        temp[i] = temp[i] / 32767f;
    }

    return temp;
}
 类似资料:
  • 我有音频数据记录从麦克风这样:(ndarray的浮动) 这是我的代码: 但当我播放音频时,它就坏了,只有噪音。。。如何将其转换为。wav音频文件?

  • 问题内容: 我只想知道在Java或C#中是否有任何库或外部库中的构建允许我获取音频文件并对其进行解析并从中提取文本。 我需要创建一个应用程序,但是我不知道从哪里开始。 问题答案: 以下是您的一些选择: 微软演讲 光明 龙自然讲 狮身人面像4

  • 我目前正在处理音频样本。我从AVAssetReader获得它们,并有一个,其内容如下: 如您所见,我找到的唯一用于转换[Int16]->[Float]的方法是,但这样做会增加我的处理时间。是否存在将Int16指针转换为Float指针的其他方法?

  • 问题内容: 我最终想要做的是从用户的麦克风中进行录音,并在完成后将文件上传到服务器。到目前为止,我已经设法使用以下代码将数据流传递到元素: 如何从那开始,到录制到文件? 问题答案: 它允许您在浏览器中录制音频,然后为您提供导出和下载录制内容的选项。 您可以查看该页面的源代码以找到指向javascript的链接,但总而言之,有一个对象包含一个方法和一个方法。

  • 我想把音频文件转换成base64只使用Javascript。 我们可以使用画布将图像转换为base64。但是我们如何转换音频文件。 任何帮助都将感激不尽。

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