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

音频:改变字节数组中样本的音量

慕嘉运
2023-03-14

我正在使用这个方法将WAV文件读到字节数组(如下所示)。现在我已经将它存储在字节数组中,我想改变声音的音量。

private byte[] getAudioFileData(final String filePath) {
    byte[] data = null;
    try {
    final ByteArrayOutputStream baout = new ByteArrayOutputStream();
    final File file = new File(filePath);
    final AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);

    byte[] buffer = new byte[4096];
    int c;
    while ((c = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
        baout.write(buffer, 0, c);
    }
    audioInputStream.close();
    baout.close();
    data = baout.toByteArray();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return data;
}

编辑:根据要求提供音频格式的一些信息:

private byte[] adjustVolume(byte[] audioSamples, double volume) {
    byte[] array = new byte[audioSamples.length];
    for (int i = 0; i < array.length; i+=2) {
        // convert byte pair to int
        int audioSample = (int) ((audioSamples[i+1] & 0xff) << 8) | (audioSamples[i] & 0xff);

        audioSample = (int) (audioSample * volume);

        // convert back
        array[i] = (byte) audioSample;
        array[i+1] = (byte) (audioSample >> 8);

    }
    return array;
}

共有1个答案

魏毅
2023-03-14

你确定你在读8位单声道音频吗?否则,一个字节不等于一个样本,您不能只缩放每个字节。例如。如果是16位数据,则必须将每对字节解析为16位整数,缩放该整数,然后将其写回为两个字节。

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

  • 我试图写一个简单的应用程序,播放声音,可以改变音量的声音在任何时候播放。我通过将声音字节数组中的每对字节转换成一个整数,然后将这个整数乘以音量的增加或减少,然后将它们写回为两个字节(即1个样本)。然而,这导致了声音的极度失真。有没有可能我把位移错了?我的声音格式是: 这段代码的基础是:audio:改变字节数组中样本的音量,而asker正试图在其中执行相同的操作。然而,使用了他的问题中的代码(我认为

  • 我正在构建一个相当简单的Android应用程序(sdk修订版14:ICS),它允许用户一次选择两个音频片段(都是RIFF/WAV格式、little endian、签名PCM-16位编码),并以各种方式组合它们以创建新的声音。我对这种组合使用的最基本方法如下: 然后可以通过AudioTrack类播放返回的字节数组: 使用上面代码的组合和回放的结果接近我想要的(两个样本在产生的杂交声音中仍然可以辨别)

  • 我曾尝试将4个单独的字节数组合并到一个文件中,但我只得到空指针异常,我不知道为什么。我的音频格式是16位PCM签名的,我知道我应该使用short而不是bytes,但老实说,我完全迷茫了。 这就是我目前正在尝试的,但它正在以

  • IBM speech to text-我如何将MP3音频文件转换成字节数组,然后发送到IBM Watson服务器,使用speech to text API将音频转换成文本

  • 问题内容: 我一直在尝试通过以下代码调整音频片段的音调: http://developer.android.com/guide/topics/media/audio- capture.html 我的猜测是应该使用进行此调整。 http://developer.android.com/reference/android/media/MediaRecorder.html 但是,我不确定调用哪种方法来改