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); // 打开 TargetDataLineline.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);
}