首页 > 其他分享 >Flutter音频处理

Flutter音频处理

时间:2024-10-18 20:51:50浏览次数:11  
标签:采样率 每个 16 处理 音频 样本 深度 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);
}

标签:采样率,每个,16,处理,音频,样本,深度,Flutter
From: https://blog.csdn.net/nonagontech/article/details/143061326

相关文章

  • Flutter路由管理
    前言这篇文章我通过页面跳转、路由传参、命名路由、路由生成钩子的顺序从简入深的说明Flutter的路由。想要了解Flutter的路由就要了解MaterialPageRoute和NavigatorMaterialPageRouteMaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一......
  • Flutter 获取设备网络类型
    前言现在有一个需求,需要能够知道手机端网络类型,如果是WiFi则去使用局域网通信。在这里我选用了connectivity_plus这个库connectivity_plus的平台支持安卓iOS系统苹果系统网络Linux视窗✅✅✅✅✅✅connectivity_plus的APIAPI描述checkConnectivity检查......
  • 常量、变量与简单的str处理
    1、常量、变量与简单的str处理1、常量与变量程序中有2种"量",一种是可以变的,一种是不能变的,我们将它们成为变量、常量常量就是固定不变的量6699#6699就是一个常量print(100)#这个100就是常量print(3.1415)#3.1415在一些地方,人们经常使用“变量是盒子”这样的比喻,......
  • 三、MyBatis实践:提高持久层数据处理效率(1)(包含mybatis下载官网)
    一、Mybatis简介1.1简介https://mybatis.org/mybatis-3/zh/index.htmlMyBatis最初是Apache的一个开源项目iBatis,2010年6月这个项目由ApacheSoftwareFoundation迁移到了GoogleCode。随着开发团队转投GoogleCode旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移......
  • 调用淘宝 API 时如何处理错误信息?
    在调用淘宝API时,可以按照以下方式处理错误信息:一、了解淘宝API的错误码体系:仔细研读文档:淘宝API有一套自己的错误码定义,在开发前要认真阅读淘宝开放平台提供的API文档,熟悉各种错误码的含义及对应的解决方案。例如,“isv.invalid-parameter”可能表示参数无效,“isv.trade-no......
  • 数据预处理-DataFrame切片
    此Blog仅作为日常学习工作中记录使用,Blog中有不足之处欢迎指出以kaggle中房屋预测的训练集为例,说明DataFrame切片常用操作一、读入数据importnumpyasnpimportpandasaspdfile_path='***\kaggle_house_pred_train.csv'data=pd.read_csv(file_path)data.columns......
  • 如何在 Spring Boot 中处理 Protobuf 数据格式
    个人名片......
  • 用大模型或者向量模型比如huggingface上的模型,处理一批图片,对该图片进行分类,检索
    要使用大模型或向量模型对图片进行分类和检索,通常可以采用以下几种方法:1.**图像分类**:使用预训练的图像分类模型(如ResNet、EfficientNet等)对图片进行分类。2.**图像特征提取**:使用预训练的模型(如CLIP、ResNet等)提取图像的特征向量,然后进行相似度检索。以下是使用HuggingF......
  • MySQL主从数据不一致问题处理
    分析问题网络延迟mysql主从复制默认的是异步复制,通过网络传输binlog日志文件,可能你从库在设计之初就是跨机房或者网络故障,导致binlog传输出现延迟或故障,从而导致不同步或不一致。服务器负载如果其中某一台服务器负载太高或者磁盘占用100%,涉及msyql主从复制的3个线程可能会......
  • 分段处理海量数据SQL
    在DB2中,你可以使用`ROW_NUMBER()`窗口函数来为表中的每一行分配一个唯一的序号。然后,基于这个序号,你可以将数据划分成指定数量的组,并确定每组的上边界和下边界。假设你的表名为`my_table`并且它有一个唯一索引列叫做`id`。你想把1000条记录分成10组,那么每组应该包含100条记......