PCM到WAV的转换(java)
来源:互联网 发布:用友软件 主要客户 编辑:程序博客网 时间:2024/05/01 08:37
其实WAV只是PCM文件加上相关的文件头和描述信息,不算复杂。这段程序参考了网上的一些实现(C/C++),修改了其中的一些错误,比如转换后的文件能够播放但是时间长度是错误的;或者不能拖动等等。
代码见下。
private void convertAudioFiles(String src, String target) throws Exception {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(target);
//计算长度
byte[] buf = new byte[1024 * 4];
int size = fis.read(buf);
int PCMSize = 0;
while (size != -1) {
PCMSize += size;
size = fis.read(buf);
}
fis.close();
//填入参数,比特率等等。这里用的是16位单声道 8000 hz
WaveHeader header = new WaveHeader();
//长度字段 = 内容的大小(PCMSize) + 头部字段的大小(不包括前面4字节的标识符RIFF以及fileLength本身的4字节)
header.fileLength = PCMSize + (44 - 8);
header.FmtHdrLeth = 16;
header.BitsPerSample = 16;
header.Channels = 1;
header.FormatTag = 0x0001;
header.SamplesPerSec = 8000;
header.BlockAlign = (short)(header.Channels * header.BitsPerSample / 8);
header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec;
header.DataHdrLeth = PCMSize;
byte[] h = header.getHeader();
assert h.length == 44; //WAV标准,头部应该是44字节
//write header
fos.write(h, 0, h.length);
//write data stream
fis = new FileInputStream(src);
size = fis.read(buf);
while (size != -1) {
fos.write(buf, 0, size);
size = fis.read(buf);
}
fis.close();
fos.close();
System.out.println("Convert OK!");
}
WavHeader辅助类。用于生成头部信息。
public class WaveHeader {
public final char fileID[] = {'R', 'I', 'F', 'F'};
public int fileLength;
public char wavTag[] = {'W', 'A', 'V', 'E'};;
public char FmtHdrID[] = {'f', 'm', 't', ' '};
public int FmtHdrLeth;
public short FormatTag;
public short Channels;
public int SamplesPerSec;
public int AvgBytesPerSec;
public short BlockAlign;
public short BitsPerSample;
public char DataHdrID[] = {'d','a','t','a'};
public int DataHdrLeth;
public byte[] getHeader() throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
WriteChar(bos, fileID);
WriteInt(bos, fileLength);
WriteChar(bos, wavTag);
WriteChar(bos, FmtHdrID);
WriteInt(bos,FmtHdrLeth);
WriteShort(bos,FormatTag);
WriteShort(bos,Channels);
WriteInt(bos,SamplesPerSec);
WriteInt(bos,AvgBytesPerSec);
WriteShort(bos,BlockAlign);
WriteShort(bos,BitsPerSample);
WriteChar(bos,DataHdrID);
WriteInt(bos,DataHdrLeth);
bos.flush();
byte[] r = bos.toByteArray();
bos.close();
return r;
}
private void WriteShort(ByteArrayOutputStream bos, int s) throws IOException {
byte[] mybyte = new byte[2];
mybyte[1] =(byte)( (s << 16) >> 24 );
mybyte[0] =(byte)( (s << 24) >> 24 );
bos.write(mybyte);
}
private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {
byte[] buf = new byte[4];
buf[3] =(byte)( n >> 24 );
buf[2] =(byte)( (n << 8) >> 24 );
buf[1] =(byte)( (n << 16) >> 24 );
buf[0] =(byte)( (n << 24) >> 24 );
bos.write(buf);
}
private void WriteChar(ByteArrayOutputStream bos, char[] id) {
for (int i=0; i<id.length; i++) {
char c = id[i];
bos.write(c);
}
}
}
来源:http://hi.baidu.com/lff0305/blog/item/7d8ba938246f22cfd5622596.html
- PCM到WAV的转换(java)
- PCM到WAV的转换(Java)
- PCM 转换为 WAV (java)
- WAV和PCM文件转换的程序
- 音频文件pcm转换wav
- ffmpeg pcm 到 wav
- pcm 格式 转换成 wav
- pcm 格式 转换成 wav
- java+lame实现wav到mp3的转换
- WAV文件格式(PCM方式)
- 将PCM数据转换成WAV文件
- Raw PCM转换为wav格式
- WAV && PCM
- java 微信小程序 语音识别成文字 音频格式转换 silk pcm wav
- java wav文件转pcm文件
- WAV和PCM的关系和区别
- qt录音--raw(pcm)文件转换wav文件
- Ruby 操作二进制文件,wav与pcm文件转换
- Mesh网格篇(二)网格的快速切割
- iOS UIWebView 图片自适应屏幕宽度
- angular2 +Polymer 环境搭建
- 伪聊天室实现记录
- ForForDemo
- PCM到WAV的转换(java)
- jQuery父级以及同级元素查找介绍
- 微机个人笔记-中断
- CkEditor批量上传图片(java)
- 最简单的jquery插件开发示例
- Win2008 r2 iis7/iis7.5系统下HTTP重定向
- Android样式的开发:drawable汇总篇
- MongoDB的安装与部署
- JAVA 7 的新特性总结