java 简易wav音频文件播放器

  • 测试文件
  • 源码
  • 相关资料

测试文件

csdn下载 : https://download.csdn.net/download/qq_41054313/18704149
百度网盘 : https://pan.baidu.com/s/1U93rkCs-jqrPBE-Zgd_W7A 提取码:xhn8

源码

import java.io.FileInputStream;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;/*** 简易wave音频文件播放器
* @author 作者 luhua
* @version 创建时间:2021年5月14日 下午3:20:11
*/
public class WavePlayer {public static void main(String[] args) throws Exception {String path = "F:\\testFile\\audio\\b.wav";if(null != args && args.length > 0) {path = args[0];}FileInputStream fis = new FileInputStream(path);/**解析wav头*/WavHeard pasrWaveHeard = pasrWaveHeard(fis);if(null != pasrWaveHeard) {System.out.println(pasrWaveHeard);AudioFormat.Encoding encoding =  new AudioFormat.Encoding("PCM_SIGNED");//编码格式,采样率,每个样本的位数,声道,帧长(字节),帧数,是否按big-endian字节顺序存储AudioFormat format = new AudioFormat(encoding,pasrWaveHeard.sampleRate, pasrWaveHeard.formatSize, pasrWaveHeard.numChannels, pasrWaveHeard.blockAlign, pasrWaveHeard.sampleRate ,false);SourceDataLine auline = null;DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);System.out.println(format);auline = (SourceDataLine) AudioSystem.getLine(info);auline.open(format);auline.start();byte[] b = new byte[pasrWaveHeard.bytesPerSecond];int len = 0;while((len = fis.read(b))>0) {auline.write(b, 0, len);}auline.close();}}public static WavHeard pasrWaveHeard(FileInputStream fis) throws Exception{WavHeard wavHeard = new WavHeard();byte[] b = new byte[4];/**RIFF部分*/fis.read(wavHeard.riffType);if(!"RIFF".equalsIgnoreCase(new String(wavHeard.riffType))) {System.out.println("This is not a valid wav(RIFF) file.");return null;}/**riffSize*/fis.read(b);wavHeard.riffSize = (b[3]&0xff)<<24|(b[2]&0xff)<<16|(b[1]&0xff)<<8|(b[0]&0xff);/**wave*/fis.read(wavHeard.waveType);/**FMT */fis.read(wavHeard.formatType);if(!"FMT ".equalsIgnoreCase(new String(wavHeard.formatType))) {System.out.println("This is not a valid wav(FMT) file.");return null;}/**表示该区块数据的长度(不包含FMT 和fSize的长度)*/fis.read(b);wavHeard.formatSize = (b[3]&0xff)<<24 | (b[2]&0xff)<<16 | (b[1]&0xff)<<8 | (b[0]&0xff);/**PCM音频数据的值为1*/b = new byte[2];fis.read(b);wavHeard.compressionCode = (short) ((b[1]&0xff)<<8 | (b[0]&0xff));/**音频数据的声道数,1:单声道,2:双声道*/fis.read(b);wavHeard.numChannels = (short) ((b[1]&0xff)<<8 | (b[0]&0xff));/**采样率*/b = new byte[4];fis.read(b);wavHeard.sampleRate = (b[3]&0xff) <<24 | (b[2]&0xff)<<16 | (b[1]&0xff)<<8 | (b[0]&0xff);/**每秒数据字节数*/fis.read(b);wavHeard.bytesPerSecond = (b[3]&0xff) <<24 | (b[2]&0xff)<<16 | (b[1]&0xff)<<8 | (b[0]&0xff);/**每个采样所需字节数*/b = new byte[2];fis.read(b);wavHeard.blockAlign = (short) ((b[1]&0xff)<<8 | (b[0]&0xff));/**每个采样存储的bit数*/fis.read(b);wavHeard.bitsPerSample = (short) ((b[1]&0xff)<<8 | (b[0]&0xff));/**data*/fis.read(wavHeard.dataType);/**dataSize*/b = new byte[4];fis.read(b);wavHeard.dataSize = (b[3]&0xff) <<24 | (b[2]&0xff)<<16 | (b[1]&0xff)<<8 | (b[0]&0xff);return wavHeard;}}class WavHeard{  public byte[] riffType = new byte[4];        //4byte,资源交换文件标志:RIFF     public int    riffSize;                       //4byte,从下个地址到文件结尾的总字节数   public byte[]   waveType = new byte[4];      //4byte,wav文件标志:WAVE      public byte[]   formatType = new byte[4];    //4byte,波形文件标志:FMT(最后一位空格符)   public int    formatSize;                     //4byte,音频属性(compressionCode,numChannels,sampleRate,bytesPerSecond,blockAlign,bitsPerSample)所占字节数  public short  compressionCode;               //2byte,格式种类(1-线性pcm-WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM)  public short  numChannels;                  //2byte,通道数  public int    sampleRate;                  //4byte,采样率  public int    bytesPerSecond;              //4byte,传输速率  public short  blockAlign;                     //2byte,数据块的对齐,即DATA数据块长度  public short  bitsPerSample;                  //2byte,采样精度-PCM位宽  public byte[]   dataType = new byte[4];     //4byte,数据标志:data  public int    dataSize;                     //4byte,从下个地址到文件结尾的总字节数,即除了wav header以外的pcm data length  @Overridepublic String toString() {return "------------------RIFF------------------\n"+ "\n riffType\t:"+new String(riffType)+"\n riffSize\t:"+riffSize+"\n waveType\t:"+new String(waveType)+"\n\n------------------FORMAT----------------\n"+"\n formatType\t:"+ new String(formatType) +"\n formatSize\t:"+ formatSize +"\n compressionCode:"+ compressionCode +"\n numChannels\t:" + numChannels +"\n sampleRate\t:" + sampleRate +"\n bytesPerSecond\t:" + bytesPerSecond +"\n blockAlign\t:" + blockAlign +"\n bitsPerSample\t:" + bitsPerSample +"\n dataType\t:" + new String(dataType) +"\n dataSize\t:" + dataSize + "\n\n-----------------------------------------";}}

相关资料

wav音频文件解析
java播放pcm音频文件

java wav音频文件播放器demo相关推荐

  1. python播放wav文件_python3 写一个WAV音频文件播放器的代码

    环境:ubuntu 16.04 python3.5 pycharm 包 : wave pyaudio sys 上代码:AudioPlayer.py # coding:utf-8 # author:ki ...

  2. 利用DirectShow开发C#版的音频文件播放器(三)

    前面曾经讲到了利用利用DirectShow开发C#版的MP3播放器,这篇文章是对前面两篇文章的补充与升华. 首先,大家不难发现,这篇文章的标题已经修改为音频文件播放器,而不仅仅是针对MP3一种格式,支 ...

  3. 利用DirectShow开发C#版的音频文件播放器(补充完善)

    继今年三月份利用DirectShow开发C#版的音频文件播放器(三)文章之后,一直希望对这个音频文件播放器所存在的一些问题做修改完善,可惜一直忙于工作而无暇顾及这个事情.近日,有读者朋友提到了这个问题 ...

  4. VS2010 关于.wav音频文件播放

    录音工具,推荐使用Win7操作系统自带录音机. 修改录音机输出开始→所有程序→附件→右击录音机→属性,在目标栏路径有添加 空格/file outputfile.wav. 使用录音机录制相关音频XXX. ...

  5. java 上传mp3文件大小,Java获取音频文件(MP3)的播放时长

    最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐. 这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件. 方案一:Java的方式 找第三方的库,真的感谢这些提供j ...

  6. java mp3转midi_java midi音乐文件播放器

    您的位置:首页 - 教程 - Java - 正文 java midi音乐文件播放器 java midi音乐文件播放器 import javax.swing.*; import javax.sound. ...

  7. Java 采集声音_通过java采集PC麦克风音频及播放wav音频文件

    AudioFormat对象 sampleRate 采样率 每秒音频采样数量 sampleSizeInBits 采样位数 每个采样的位数 channels 声道 1: Mono 单声道,2:Stereo ...

  8. Java程序获取和修改.wav音频文件的内部结构

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客) wav音频文件是一种无损的音频文件, ...

  9. android 字节转wav,android开发:把一个byte数组转换成wav音频文件,并且播放

    ============问题描述============ 如题,byte数组转换成wav音频文件,并且播放,下面代码能生成data/data/com.example.playwav/cache/tem ...

最新文章

  1. 从输入URL到页面加载的过程
  2. Java IO流学习总结二:File
  3. mysql 5.7主从延迟 相关参数配置
  4. React-Native学习笔记
  5. 京东云擎提供了免费的wordpress一键安装功能了
  6. 8代cpu能跑linux,Intel公布6/7/8代桌面CPU打漏洞补丁性能结果:影响很小
  7. 我身边的计算机网,电脑在我身边作文700字
  8. 还在使用 Windows?我的70岁母亲都用了 21 年 Linux
  9. Android自定义控件ImageViwe(四)——多点触控实现图片的自由移动
  10. Multiload-ng
  11. Relatives POJ - 2407(不打表的欧拉函数 单求)
  12. LINUX中的gpio口使用方法,Linux中的gpio口使用方法
  13. python关闭线程池_python线程池
  14. 记录神通数据库2022安装
  15. 算法模板-深度优先遍历
  16. Tableau详细安装教程【踩坑】
  17. 拉结尔6月21日服务器维护,《拉结尔》6月19日换端更新公告
  18. 用asp.net写的一个购物网站
  19. 百度热力图颜色说明_千变万化的热力图,总有一款适合你!
  20. python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...

热门文章

  1. 稻草人企业站DCRCMS代码审计
  2. win10鼠标右键文件夹一直转圈圈
  3. 用SymPy验证圆锥曲线性质
  4. 利用拟重合指数求解密钥具体内容
  5. CocosCreator 2.x Spine动画相关方法
  6. 云计算下半场,阿里云的谋篇布局
  7. ppt中如何合并流程图_简单4招,教你轻松搞定PPT中的流程图!
  8. 成都拓嘉启远:拼多多活动主图该怎样制作
  9. Java多线程异常抛出后的表现及捕获
  10. 支持markdown的服务器,Algernon:支持Lua,Markdown,HTTP/2的全功能Web服务器