Flutter音频处理

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值