sampleSizeInBits 每个样本的位数
每个样本的位数(sampleSizeInBits
)指的是在音频信号中,每个样本的位深度,也就是每个音频样本的数字表示所使用的位数。这一参数直接影响音频的动态范围和音质。常用的为
- 8位
- 16位
- 24位
- 32位
1. 位深度(Sample Size)
-
8 位:每个样本用 8 位二进制表示,值范围是 0 到 255(无符号)。这种位深度较低,动态范围和音质也相对较低。常用于低质量或某些特殊应用(例如旧的电话系统)。
-
16 位:每个样本用 16 位二进制表示,值范围是 -32768 到 32767(有符号)。这是 CD 音质的标准位深度,提供了较好的音质和动态范围。
-
24 位:每个样本用 24 位二进制表示,值范围是 -8388608 到 8388607(有符号)。提供更高的音质和动态范围,常用于高保真音频录制和处理。
-
32 位:每个样本用 32 位二进制表示,值范围非常广泛。主要用于专业音频处理和高动态范围应用。
2. 动态范围
位深度越高,每个样本可以表示的音频强度范围(动态范围)就越大。动态范围是指音频中最小和最大声音强度之间的差异:
- 8 位:动态范围较小,音频质量有限。
- 16 位:动态范围约为 96 dB,足以满足大多数消费音频的需求。
- 24 位:动态范围约为 144 dB,适用于需要更高音频质量的专业录音和混音。
3. 音频质量
位深度影响音频的质量和准确性:
- 低位深度:声音可能会出现量化噪声,细节可能丢失。
- 高位深度:声音更接近原始录音,细节保留更多,音质更好。
4. 存储需求
位深度也影响音频文件的大小。位深度越大,每个样本所需的存储空间就越多,因此音频文件的整体大小也会增加。例如:
- 8 位:每个样本 1 字节。
- 16 位:每个样本 2 字节。
- 24 位:每个样本 3 字节。
- 32 位:每个样本 4 字节。
每秒钟的数据量
数据量 = 采样率 × 位深度 × 通道数 × 时间 |
示例:
假设你有一个采样率为 44.1kHz,位深度为 16 位的音频文件:
- 采样率:44,100 次采样/秒
- 位深度:16 位
对于单声道音频:
数据量 = 44100 × 16 / 8 = 88200 字节/秒 ≈ 86 KB/秒
对于立体声音频(两个声道):
数据量 = 44100 × 16 × 2 / 8 = 176400 字节/秒 ≈ 172 KB/秒
总结:每个样本的位数决定了音频数据的精度、质量和存储需求。通常选择适当的位深度以满足所需的音频质量和处理需求。
采样率
采样率(Sampling Rate)是音频信号中每秒钟采集的样本数,通常以赫兹(Hz)为单位表示。它是音频数字化过程中的一个重要参数,决定了音频信号的频率响应和音质。
定义
- 采样率:每秒钟采集的音频样本数量。例如,44.1kHz(即 44,100 次采样/秒)表示每秒钟对音频信号进行 44,100 次采样。
JAVA,以下代码未验证,只对格式进行解析
public class AudioRecorder { // 定义音频格式 private AudioFormat getAudioFormat() { float sampleRate = 16000; // 采样率 int sampleSizeInBits = 16; // 每个样本的位数 int channels = 1; // 单声道(1 为单声道,2 为立体声) boolean signed = true; // 是否使用有符号的音频 boolean bigEndian = false; // 是否使用大端字节序 return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian); } // 开始录音 public void startRecording(String filePath) { AudioFormat format = getAudioFormat(); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); if (!AudioSystem.isLineSupported(info)) { System.out.println("不支持的音频格式"); return; } try (TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info)) { line.open(format); // 打开 TargetDataLine line.start(); // 开始录音 System.out.println("开始录音..."); AudioInputStream ais = new AudioInputStream(line); // 将音频流写入 WAV 文件 File wavFile = new File(filePath); AudioSystem.write(ais, AudioFileFormat.Type.WAVE, wavFile); System.out.println("录音结束,文件已保存到 " + filePath); } catch (LineUnavailableException | IOException ex) { ex.printStackTrace(); } } public static void main(String[] args) { AudioRecorder recorder = new AudioRecorder(); // 录制 10 秒 new Thread(() -> { recorder.startRecording("test.wav"); }).start(); // 录制 10 秒后停止 try { Thread.sleep(10000); // 录制时间 10 秒 } catch (InterruptedException ex) { ex.printStackTrace(); } System.exit(0); // 退出应用程序 } } |
private AudioFormat getAudioFormat() {
float sampleRate = 16000; // 采样率
int sampleSizeInBits = 16; // 每个样本的位数
int channels = 1; // 单声道(1 为单声道,2 为立体声)
boolean signed = true; // 是否使用有符号的音频
boolean bigEndian = false; // 是否使用大端字节序
return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
}