java给pcm添加头wav头

pcm和wav

pcm

PCM是一种数字音频编码方式,即脉冲编码调制(Pulse Code Modulation)。PCM是一种将模拟信号转换成数字信号的技术,主要用于数字音频的存储和传输。PCM在音频领域的应用非常广泛,例如CD、DVD、数字广播、数字电视等。

PCM编码过程中,通过抽样、量化和编码三个步骤将模拟信号转换为数字信号。首先将模拟信号按照一定的时间间隔进行抽样,得到一系列数字量化值。然后将这些量化值按照预定的量化步长进行量化,将连续的模拟信号量化为离散的数字信号。最后将这些数字信号进行编码和压缩,以减小数据量。

PCM具有高保真度、容错性好、抗干扰能力强等优点,适合于音乐和语音等高保真度数字音频的处理和传输。缺点是数据量较大,需要较高的存储和传输带宽。

wav 

WAV是一种音频文件格式,全称为Waveform Audio File Format,中文名为波形音频文件格式。它是Windows操作系统中默认的音频文件格式,通常用于存储高质量的音频数据,比如音乐、录音等。

WAV文件的特点是无损压缩,即不会失去任何音频质量。它可以支持多种音频编码方式,比如PCM编码和ADPCM编码等。由于WAV文件不进行任何压缩,所以它的文件大小相对较大,这也是WAV文件的一个缺点。

除了音频数据外,WAV文件还可以包含元数据,比如歌曲的歌手、专辑名称、发行日期等信息。这些元数据可以帮助用户更好地管理和查找自己的音乐文件。

pcm和wav的区别

PCM和WAV都是数字音频的编码格式,但是它们之间有一些区别:

  1. PCM是一种音频信号的编码方式,它将模拟音频信号转换成数字音频信号。而WAV是一种容器格式,它可以将不同的编码格式的音频数据储存起来,比如PCM、MP3等。

  2. PCM是无损的编码格式,它将原始音频信号转换为数值型数据储存。而WAV可以支持无损和有损的编码格式。

  3. PCM文件只储存音频数据,没有元数据。而WAV文件可以包含音频数据、元数据、文本等。

  4. WAV是微软公司开发的一种标准文件格式,所以WAV文件通常在Windows系统上使用较为广泛。而PCM是编码方式,不属于某一种文件格式。

  5. WAV文件可以包含多种采样率和位深度的音频数据,而PCM只能够描述一种采样率和位深度的音频数据。

总之,PCM是一种音频信号的编码方式,而WAV是一种文件格式,可以储存不同编码格式的音频数据。在使用中,可以根据具体情况选择使用PCM还是WAV。

java编写添加音频头的代码

工具类

import lombok.extern.slf4j.Slf4j;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.File;
import java.io.IOException;@Slf4j
public class WavUtil {public static WavHead getWavHead(String file){WavHead oneHead = new WavHead();AudioInputStream audioInputStream = null;try {audioInputStream = AudioSystem.getAudioInputStream(new File(file));AudioFormat audioFormat = audioInputStream.getFormat();oneHead.setChannel(audioFormat.getChannels());oneHead.setSampleRate((int)(audioFormat.getSampleRate()));} catch (UnsupportedAudioFileException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return oneHead;}//file 是文件的路径,将文件装换成byte[]public static byte[] readWavFromFile(String file) {byte[] b = null;try {AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(file));AudioFormat audioFormat = audioInputStream.getFormat();Integer sampleRate = (int)(audioFormat.getSampleRate());long frameLength = audioInputStream.getFrameLength();int frameSize = audioFormat.getFrameSize();int channel = audioFormat.getChannels();int pcmlen = (int)frameLength*frameSize;log.info("sampleRate="+ sampleRate +" frameLength="+frameLength + " channel="+channel+" pcmlen="+pcmlen);int readlen = 0;if ((sampleRate==16000 || sampleRate==8000) && channel==1) {b = new byte[pcmlen];int byteLen = audioInputStream.read(b);System.out.println("pcmlen=" + pcmlen + " readlen=" + readlen);audioInputStream.close();}} catch (UnsupportedAudioFileException | IOException e) {e.printStackTrace();}return b;}public static byte[] createWavHeader(int fileSize) {int HEADER_SIZE = 44;byte[] header = new byte[HEADER_SIZE];// RIFF头header[0] = 'R';header[1] = 'I';header[2] = 'F';header[3] = 'F';setInt(header, 4, fileSize + HEADER_SIZE - 8);// FORMAT头header[8] = 'W';header[9] = 'A';header[10] = 'V';header[11] = 'E';header[12] = 'f';header[13] = 'm';header[14] = 't';header[15] = ' ';setInt(header, 16, 16);setShort(header, 20, (short) 1);setShort(header, 22, (short) 1);setInt(header, 24, 16000);setInt(header, 28, 16000 * 2);setShort(header, 32, (short) 2);setShort(header, 34, (short) 16);// DATA头header[36] = 'd';header[37] = 'a';header[38] = 't';header[39] = 'a';setInt(header, 40, fileSize);return header;}private static void setInt(byte[] bytes, int offset, int value) {bytes[offset] = (byte) (value & 0xFF);bytes[offset + 1] = (byte) ((value >> 8) & 0xFF);bytes[offset + 2] = (byte) ((value >> 16) & 0xFF);bytes[offset + 3] = (byte) ((value >> 24) & 0xFF);}private static void setShort(byte[] bytes, int offset, short value) {bytes[offset] = (byte) (value & 0xFF);bytes[offset + 1] = (byte) ((value >> 8) & 0xFF);}
}

pojo类

import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class WavHead
{private  int sampleRate;private  int channel;public WavHead(){sampleRate = 0;channel = 0;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梯度下降与损失函数的基础知识

文章目录 一、基础知识梯度下降损失函数的要求损失函数凸函数 二、预测的任务理解策略梯度 一、基础知识 梯度下降 梯度下降(Gradient Descent)是一种常用的优化算法,用于最小化损失函数或目标函数。它是一种迭代的优化方法,通过…

JOSEF 综合继电器 HJZZ-32/2 AC220V 合闸延时整定0.02-9.99S

系列型号: HJZZ-91分闸、合闸、电源监视综合装置; HJZZ-92/1分闸、合闸、电源监视综合装置; HJZZ-92/2分闸、合闸、电源监视综合装置; HJZZ-92/2A分闸、合闸、电源监视综合装置; HJZZ-92/3分闸、合闸、电源监视综…

【机器学习】决策树

一、原理 典型的决策树 分类树与回归树 如何用训练样本建立决策树 分裂规则 不纯度 各种不纯度指标定义 对于数值型特征和分类型特征分别详述确定分裂阈值和分裂特征的过程 对于分类树和回归树如何确定叶子节点的值 对于样本特征向量属性缺失情况如何处理 对于属性缺失情况&am…

android自定义桌面应用

android自定义桌面应用 这篇文章主要讲下自定义桌面应用. 效果主要是调用packageManager来获取当前所有的程序,并在自定义桌面程序中展示,并支持跳转. 主要的代码如下: 1.manifest声明 <activity android:name".MainActivity"><intent-filter><ac…

【uniapp】微信运行报错TypeError_ Cannot read property ‘FormData‘ of undefined

文章目录 一、报错详情&#xff1a;二、解决&#xff1a; 一、报错详情&#xff1a; 二、解决&#xff1a; npm install axios0.27.2 #或者 npm install axios1.3.4

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪&#xff0c;随时可以接受CPU的调度。阻塞状态线程处于阻塞等待&#xff0c;暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核&#xff0c;Java…

SELinux零知识学习三十六、SELinux策略语言之角色和用户(7)

接前一篇文章:SELinux零知识学习三十五、SELinux策略语言之角色和用户(6) 三、SELinux策略语言之角色和用户 SELinux提供了一种依赖于类型强制(类型增强,TE)的基于角色的访问控制(Role-Based Access Control),角色用于组域类型和限制域类型与用户之间的关系,SELinux…

Doris-数据导入 (二十三)

导入&#xff08;Load&#xff09;功能就是将用户的原始数据导入到 Doris 中。导入成功后&#xff0c;用户即可通过Mysql 客户端查询数据。为适配不同的数据导入需求&#xff0c;Doris 系统提供了 6 种不同的导入方式。每种导入方式支持不同的数据源&#xff0c;存在不同的使用…

内测分发平台是否支持应用的微服务化部署

内测分发平台的微服务化部署支持是现代应用开发和部署的一个重要特性。首先我们得知道什么是微服务化部署都有哪些关键功能&#xff0c;如何实施微服务化的部署。下文以我自己理解总结了几点。 图片来源:news.gulufenfa.com 微服务是一种基于独立运行的小型服务来构建应用程序…

ILSVRC2012数据集处理

ILSVRC2012数据集处理 解压图像处理标签和图像 解压图像 先解压 tar -xvf ILSVRC2012_img_train.tar 解压之后其实还是1000个tar压缩包&#xff08;对应1000个类别&#xff09;&#xff0c;需要再次解压&#xff0c;解压脚本unzip.sh如下&#xff08;PS&#xff1a;可能需要自…

智能优化算法应用:基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.教与学算法4.实验参数设定5.算法结果6.参考文献7.…

8.vue3项目(八):平台属性管理页面的增删改查

目录​​​​​​​ 一、平台属性管理静态搭建 二、封装接口以及入参出参 三、页面刚加载一级分类的收集与展示</

深度学习【二】

1.运行时错误 1.1 ModuleNotFoundError: No module named ‘torch_scatter’ 参考 https://blog.csdn.net/weixin_42421914/article/details/132875571 pip install --no-index torch-scatter -f https://pytorch-geometric.com/whl/torch-1.13.1%2Bcpu.html

Day49:647. 回文子串、516.最长回文子序列

文章目录 647. 回文子串思路代码实现 516.最长回文子序列思路代码实现 647. 回文子串 题目链接 思路 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文…

亚马逊策略:通过影响者营销改造您的亚马逊商店

亚马逊卖家面临着从人群中脱颖而出的持续挑战 - 如果您是那些寻求变革性方法来接触目标受众、建立信任并将您的销售推向新高度的卖家之一&#xff0c;那么影响力营销就是您的答案。 您可能遇到过令人难以置信的成功故事&#xff0c;产品一夜之间流行起来&#xff0c;仅仅是因为…

java数据转换为stream的方法

要将数据转换为Java中的Stream&#xff0c;有几种常见的方法&#xff0c;具体取决于数据类型和数据来源。 集合&#xff08;Collection&#xff09;&#xff1a;集合对象&#xff0c;比如List、Set或者数组&#xff0c;可以使用stream()方法将其转换为Stream。 List<Strin…

集群 CPU 利用率均值达 45% ,揭秘小红书规模化混部技术实践

根据 Gartner 预测数据显示&#xff1a;2024 年全球 IT 支出预计将达到 5.1 万亿美元&#xff0c;比 2023 年增长 8 %。然而&#xff0c;该机构的另一项调查数据显示&#xff1a;全球数据中心服务器平均 CPU 利用率普遍低于 20%&#xff0c;存在巨大的资源浪费。据测算&#xf…

“全球金牌课程”1 月 13-14 日 · CSM 认证在线面授周末班【模块化教学】CST 导师亲授

课堂互动练习 CSM 认证在线培训&#xff08;周末班&#xff09; 2024 年 1 月 13-14 日 Zoom 在线面授&#xff0c;全国招生 讲师: Jim Wang 王军 10 年以上 CSM/CSPO 认证课程教学交付经验&#xff0c; 5 年以上 A-CSM/CSP-SM 认证课程教学交付经验&#xff0c; 国际 Scr…

AI 绘画 | Stable Diffusion 人物 换背景|换服装

前言 想要给固定人物换背景或者换服装,需要用到一个Stable Diffusion扩展插件,就是sd-webui-segment-anything。 sd-webui-segment-anything 不仅可以做到抠图的效果,也能实现之多蒙版的效果。什么是蒙版 图片蒙版是一种用于调节图像修改程度以及进行局部调整的工具。它通常…

面试必问的排序算法

欢迎大家到我的博客浏览。排序算法 | YinKais Blog 介绍 在面试中被问到排序算法&#xff0c;发现不能很好的描述出来&#xff0c;于是写一篇文章总结一下。常见的排序算法有 冒泡排序、插入排序、快速排序、归并排序、堆排序等。下面一一介绍。 1、冒泡排序 O(n^2) 算法思想…