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

从字节[]实时调整音频音量?

胡霖
2023-03-14

我试图写一个简单的应用程序,播放声音,可以改变音量的声音在任何时候播放。我通过将声音字节数组中的每对字节转换成一个整数,然后将这个整数乘以音量的增加或减少,然后将它们写回为两个字节(即1个样本)。然而,这导致了声音的极度失真。有没有可能我把位移错了?我的声音格式是:

.wav 44100.0hz, 16bit, little-endian
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 >> 16);

        }
        return array;
    }

这段代码的基础是:audio:改变字节数组中样本的音量,而asker正试图在其中执行相同的操作。然而,使用了他的问题中的代码(我认为在他得到答案后没有更新),我不能让它工作,我不确定它在做什么。

共有1个答案

贲培
2023-03-14

我建议您将字节数组包装在bytebuffer中(不要忘记将其.order()设置为little endian),读取short,操作它,然后再次写入。

示例代码:

// Necessary in order to convert negative shorts!
private static final int USHORT_MASK = (1 << 16) - 1;

final ByteBuffer buf = ByteBuffer.wrap(audioSamples)
    .order(ByteOrder.LITTLE_ENDIAN);
final ByteBuffer newBuf = ByteBuffer.allocate(audioSamples.length)
    .order(ByteOrder.LITTLE_ENDIAN);

int sample;

while (buf.hasRemaining()) {
    sample = (int) buf.getShort() & USHORT_MASK;
    sample *= volume;
    newBuf.putShort((short) (sample & USHORT_MASK));
}

return newBuf.array();
 类似资料:
  • 面试官人很好,一共问了70分钟,问的非常详细,基本上是以八股作为切入点,然后再去根据场景和所遇到的情况进行拓展。 项目15分钟 项目中遇到的问题以及解决的方法 实时音视频的评价指标 实时音视频的整体流程 实时音视频的编码压缩和编码 MPEG中的I帧、P帧和B帧 UDP和TCP的特点和使用场景 三次握手、四次挥手 进程和线程的关系和区别 python的装饰器 python多线程和多进程 RTP、RT

  • 问题内容: 我有一把吉他,我需要我的电脑能够分辨出正在演奏的音符,并识别出音调。可以在python中做到吗,也可以在pygame中做到吗?能够在pygame中做到这一点将非常有帮助。 问题答案: 要识别音频信号的频率,可以使用FFT(快速傅立叶变换)算法。据我所知,PyGame无法记录音频,也不支持FFT转换。 首先,您需要从声卡捕获原始采样数据。这种数据称为PCM(脉冲编码调制)。在Python

  • 问题内容: 我正在另一台PC上实现从MIC到Java服务器的实时流传输。但是我只听到白噪声。 我已经附上了客户端程序和服务器程序 并且服务器端没有问题。它与android客户端AudioRecord完美运行。 问题答案: 因此,我用正弦波(或某种在某种意义上类似正弦波的东西)填充了麦克风,并且您的程序运行正常。 因此,我的具体更改是: 显然,我将其误解为一个512字节长的片段,并破坏了正弦波,但事

  • 我的音乐应用程序从外部应用程序启动,使用意向数据作为音乐文件。 我有mp3音频URI,类似这样 file:///storage/emulated/0/Music/Tamil/I(2014)/Ennodu Nee Irundhaal。mp3 如何从媒体获取音频详细信息。标题,媒体。相册,媒体_身份证件

  • 我正在使用以下代码调整mp4视频的大小(moviepy): 当我在电脑上播放时,调整大小的剪辑的音频可以工作,但在iPhone上不行。(原始剪辑的音频确实适用于我的iPhone。) 我怎样才能解决这个问题? 第一幅图像:已调整大小的视频的编解码器 第二幅图像:原始视频的编解码器

  • 我正在使用这个方法将WAV文件读到字节数组(如下所示)。现在我已经将它存储在字节数组中,我想改变声音的音量。 编辑:根据要求提供音频格式的一些信息: