首页 > 其他分享 >音频采集转wav文件

音频采集转wav文件

时间:2024-01-17 09:56:04浏览次数:30  
标签:采样率 short 采集 音频 header 0xff wav byte

1:short[]数组的帧:

音频返回的short[]代表一个音频信号的波形数据。在数字音频处理中,波形数据通常以数字形式表示,而short[]是一种常见的表示方法。

short[]中,每个元素都是一个16位的有符号整数,通常表示一个音频样本的振幅。每个样本对应音频波形中的一个时间点。振幅的值范围在-32768到32767之间,其中0表示无振幅,正数表示正相位振幅,负数表示负相位振幅。

对于音频处理来说,采样率(sampling rate)也是一个关键的参数,它表示每秒从模拟音频信号中获取的样本数。例如,如果采样率为44100 Hz,那么每秒就会有44100个short类型的值表示音频波形。采样率与波形数据的长度之间存在直接的关系,可以通过以下公式计算:

音频数据长度=总时间采样率音频数据长度=采样率总时间​

总时间是指音频信号的持续时间,单位是秒。这样,通过short[]的长度和采样率,你可以了解到音频数据所覆盖的时间范围。

在音频处理中,还有其他一些重要的概念,如声道数(单声道、立体声等)、位深度(采样位数,表示每个样本的比特数)等,这些参数也会影响音频数据的解释和处理方式。

 

2:

如果采集工具的采样率和转成WAV文件的采样率不一致,可能会导致音频变速或者音调发生变化,这是因为不同的采样率会导致音频播放速度的改变。具体的后果取决于两个采样率之间的差异以及音频数据的内容。

  1. 变速效果: 如果转换后的WAV文件的采样率高于采集工具的采样率,音频将被加速播放;反之,如果采样率低于原始采样率,音频将被减速播放。这可能会导致声音的变化,使得音频听起来较快或较慢。

  2. 音调变化: 不同的采样率会导致音频频率的变化,从而影响音调。如果采样率增加,音频会变高调;如果采样率降低,音频会变低调。这可能导致原始声音与转换后的声音之间存在明显的音调差异。

为了避免这些问题,确保在转换过程中采用与采集工具相同的采样率。如果无法获取采集工具的准确采样率,可以尝试多个常见的采样率,然后观察转换后的音频是否听起来正常。理想情况下,你应该以原始采样率进行转换,以保持音频的原始特性。

这种差异主要是因为采样率影响了音频的时间表达和频率解析度。采样率表示每秒从模拟音频信号中取样的次数。如果两个系统(例如采集工具和WAV文件转换工具)的采样率不一致,就会导致两个关键方面的变化:

  1. 时间尺度: 不同的采样率意味着相同时间内的样本数量不同。当你改变采样率时,实际上是在改变音频的时间尺度。更高的采样率会导致更多的样本在相同的时间内,从而加快音频的播放速度;更低的采样率则会减慢播放速度。

  2. 频率解析度: 采样率还影响了对音频频率的解析度。根据奈奎斯特定理,一个信号的最高频率不能超过其采样率的一半。因此,如果你将采样率减小,可能会导致高频信息的丢失,从而影响音频的高频部分。

这两个因素的变化可能导致音频听起来变速或变调。为了保持音频的原始特性,通常应确保在处理或转换音频时使用相同的采样率。如果不同系统之间的采样率不同,可能需要进行采样率转换,以使它们保持一致。采样率转换过程中会使用插值等技术来调整音频的时间尺度和频率解析度,以尽可能地保留原始音频的特性。

 

3:采集到的帧short[]类型转为wav文件:

 public void convertToWav(short[] audioData, String filePath) {

        byte[] byteData = new byte[audioData.length * 2]; // 一个short类型占两个字节
        ByteBuffer.wrap(byteData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(audioData);
        // 创建临时 byte 数组

        try {
            // 设置音频参数
            int sampleRate = 17000;
            int numChannels = 1;
            int bitsPerSample = 16;

            // 写入WAV文件头
            long byteRate = sampleRate * numChannels * bitsPerSample / 8;
            long totalDataLen = byteData.length + 36;
            long totalAudioLen = byteData.length;
            byte[] header = new byte[44];
            header[0] = 'R';  // RIFF/WAVE header
            header[1] = 'I';
            header[2] = 'F';
            header[3] = 'F';
            header[4] = (byte) (totalDataLen & 0xff);
            header[5] = (byte) ((totalDataLen >> 8) & 0xff);
            header[6] = (byte) ((totalDataLen >> 16) & 0xff);
            header[7] = (byte) ((totalDataLen >> 24) & 0xff);
            header[8] = 'W';
            header[9] = 'A';
            header[10] = 'V';
            header[11] = 'E';
            header[12] = 'f';  // 'fmt ' chunk
            header[13] = 'm';
            header[14] = 't';
            header[15] = ' ';
            header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
            header[17] = 0;
            header[18] = 0;
            header[19] = 0;
            header[20] = 1;  // format = 1 for PCM
            header[21] = 0;
            header[22] = (byte) numChannels;
            header[23] = 0;
            header[24] = (byte) (sampleRate & 0xff);
            header[25] = (byte) ((sampleRate >> 8) & 0xff);
            header[26] = (byte) ((sampleRate >> 16) & 0xff);
            header[27] = (byte) ((sampleRate >> 24) & 0xff);
            header[28] = (byte) (byteRate & 0xff);
            header[29] = (byte) ((byteRate >> 8) & 0xff);
            header[30] = (byte) ((byteRate >> 16) & 0xff);
            header[31] = (byte) ((byteRate >> 24) & 0xff);
            header[32] = (byte) (numChannels * bitsPerSample / 8);  // block align
            header[33] = 0;
            header[34] = (byte) bitsPerSample;
            header[35] = 0;
            header[36] = 'd';
            header[37] = 'a';
            header[38] = 't';
            header[39] = 'a';
            header[40] = (byte) (totalAudioLen & 0xff);
            header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
            header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
            header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

            // 写入WAV文件
            FileOutputStream os = new FileOutputStream(filePath);
            os.write(header, 0, 44);
            os.write(byteData, 0, byteData.length);
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

 

标签:采样率,short,采集,音频,header,0xff,wav,byte
From: https://www.cnblogs.com/wnpp/p/17969097

相关文章

  • 智慧能源数据采集 Ruff数采网关以数字化赋能工业能耗管理
    我国是能源消耗大国,工业能源消耗量占全国能源消耗总量的70%。“双碳”背景下,通过提升能源利用效率,优化生产流程,并制定相应的能源管理策略,可达到节能减排的目的。能耗数据采集是实现能耗管理的关键环节,依托于物联网、云计算、大数据及无线通信技术,通过收集和分析工厂、建筑以及市政......
  • 使用shell脚本将doDBA采集到的日志会话信息导入到MySQL数据库
    【背景说明】使用doDBA工具监控的会话信息导入到MySQL数据库的表中【环境说明】doDBA工具采集会话信息(之前有脚本说明)【脚本说明】处理dodba日志信息将日志的innodb日志信息去除审计日志的名称要改为原来的dodba.log名称cd/data/backup/doDBA/log/cpdodba_20231226_09......
  • AD采集卡设计方案:630-基于PCIe的高速模拟AD采集卡
     基于PCIe的高速模拟AD采集卡一、产品概述   基于PCIe的一款分布式高速数据采集系统,实现多路AD的数据采集,并通过PCIe传输到存储计算服务器,实现信号的分析、存储。    产品固化FPGA逻辑,适配2路1Gsps/2路2Gsps采集,实现PCIe的触发采集,单次采集容量2G......
  • 基于振弦采集仪的地下工程振动监测技术研究
    基于振弦采集仪的地下工程振动监测技术研究地下工程振动监测技术是为了监测地下工程施工过程中产生的振动而进行的研究。振弦采集仪是一种常用的地下工程振动监测设备,它通过固定在地下工程附近的振弦仪来实时采集工程施工过程中产生的振动信号。 基于振弦采集仪的地下工程振......
  • 高速视频采集卡设计方案:620-基于PCIe的高速视频采集卡
    一、产品概述   基于PCIe的高速视频采集卡,通过PCIe3.0X8传输到存储计算服务器,实现信号的分析、存储。    北京太速科技产品固化FPGA逻辑,适配视频连续采集,缓存容量2GB,开源的PCIe QT客户端软件,用户可以在很短的时间内完成视频程序的开发,开发效率高、难度小。  ......
  • SparkStreaming 自定义数据采集器
    本文的前提条件:SparkStreaminginJava参考地址:SparkStreamingCustomReceivers1.自定义数据采集器packagecn.coreqi.receiver;importorg.apache.spark.storage.StorageLevel;importorg.apache.spark.streaming.receiver.Receiver;importjava.util.Random;/**......
  • 振弦采集仪在隧道工程监测中的应用与效果评估
    振弦采集仪在隧道工程监测中的应用与效果评估振弦采集仪在隧道工程监测中起到了重要的作用,主要用于对隧道结构的振动进行监测和分析。通过测量振弦的振动频率和振幅,可以评估隧道结构的稳定性和安全性。 振弦采集仪的应用主要体现在以下几个方面:1.振动监测:振弦采集仪可以实......
  • JavaScript采集各大电商平台关于预制菜酸菜鱼销售量
    因为我喜欢吃酸菜鱼,但是自己弄又弄不来,想从网上找找看看,但是种类多,自己逐个选择又太浪费时间。索性利用自己专业爬虫知识,一边检验我最近代码水平,另一方面还能选择到满意的年货。过去写个各大平台预制菜酸菜鱼销量的爬虫代码,自动化分析各大平台消费情况,选择最畅销的,准备年货。首先,我......
  • Adobe Audition 2024:音频处理的巅峰之作mac/win版
    AdobeAudition2024是一款功能强大的音频编辑和混音软件,专为专业音频制作而设计。这款软件提供了广泛的工具和功能,使用户能够处理、编辑和混合各种音频文件,从简单的音频编辑到复杂的音乐制作和后期制作工作。→→↓↓载AdobeAudition2024AdobeAudition2024引入了许多新功......
  • 用Scala采集出行平台机票价格信息
    年关将至,趁着过年,打算拖家带口的出去游玩一番,目前也没有什么计划,去哪里玩也比较随机。正好年底公司项目都已经完成差不多,利用空余时间,用爬虫爬取各大景点飞机票价格信息,选择景点不错机票便宜的,来场说走就走的旅行,犒劳一下自己。以下是一个简单的示例,用于抓取网页上的机票价格信息:im......