java - 理解大端、小端(再次)

标签 java audio

我需要你的帮助。 我想使用以下代码,因为我正在开发一个音频工具(仅适用于 .wav 文件),其 主要功能是显示信号波形。 大端和小端是我无法控制的元素。 我认为以下代码解决问题的方式是正确的: - 如果音频文件样本大小为 16 位或 8 位,并且为大端或小端,它会使用 audioData 数组重新排列样本?

如果我的推理是正确的,重新排列是否总是从大端到小端?

是否考虑了计算机架构? (我的意思是,如果我的计算机使用 Little endian,会发生什么?)

谢谢

int[] audioData = null;

if (format.getSampleSizeInBits() == 16) {
                int nlengthInSamples = audioBytes.size() / 2;
                audioData = new int[nlengthInSamples];
                // se Big Endian
                if (format.isBigEndian()) {
                    for (int i = 0; i < nlengthInSamples; i++) {
                        // MSB calculation - Most Significant Bit
                        int MSB = (int) audioBytes.get(2 * i);
                        // LSB calculation  - Least Significant Bit
                        int LSB = (int) audioBytes.get(2 * i + 1);
                        // (MSB << 8) MSB shift to the left by 8 position
                        // (255 & LSB) LSB masking so that LSB is <255 or =0
                        // putting both together
                        audioData[i] = MSB << 8 | (255 & LSB);
                    }
                } else {
                    for (int i = 0; i < nlengthInSamples; i++) {
                        int LSB = (int) audioBytes.get(2 * i);
                        int MSB = (int) audioBytes.get(2 * i + 1);
                        audioData[i] = MSB << 8 | (255 & LSB);
                    }
                }

最佳答案

Java 中的所有内容都是 Big Endian,因此您无需担心这一点。您所拥有的内容看起来是正确的(显然,请对其进行测试以确保),但我建议使用以下模式来避免代码复制。

int nlengthInSamples = audioBytes.size() / 2;
audioData = new int[nlengthInSamples];

// default BigEndian
int MSB = (int) audioBytes.get(2 * i);
int LSB = (int) audioBytes.get(2 * i + 1);

// swap for Little Endian
if(!format.isBigEndian()) {
    int temp = MSB;
    MSB = LSB;
    LSB = temp;
}

audioData[i] = MSB << 8 | (255 & LSB);

关于java - 理解大端、小端(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3241434/

相关文章:

javascript - 音频 - Chrome 移动版 - Android

objective-c - 首先 seekToTime,然后用 setVolumeRampFromStartVolume 淡入

macos - Osx:核心音频:使用AudioToolbox解析原始的压缩音频数据(以获取PCM)

java - 使用 Spring Security 时,在 bean 中获取当前用户名(即 SecurityContext)信息的正确方法是什么?

c# - 在 C# 中读取 Java UUID(从 DB)

java - 如何将以字符串形式编写的条件转换为 Java "if"条件

android - 有没有办法在我的 Android 应用程序中暂停(或静音)默认音乐播放器?

ios - Phonegap 媒体停止系统音乐

java - 从填充不同数据类型数组的对象数组中读取信息

java - 在 Eclipse 中调试 Java 时移动指令指针