Java实现PCM格式音频转MP3或WAV
最近做语音合成的项目,需要把PCM格式的音频文件转换成MP3或WAV,记录一下。
Java实现的PCM格式音频文件转换MP3格式
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** PCM 转 MP3** @author QC班长* @since 2020-02-02*/
public class PcmToMp3 {public static void main(String[] agrs) throws Exception {//convertAudioFiles("resource/茯茶素是什么,有什么效果,生产工艺有哪些?.pcm", "resource/茯茶素是什么,有什么效果,生产工艺有哪些?.mp3");convertAudioFiles("tnafcs.pcm", "tnafcs.mp3");}/*** @param src 待转换文件路径* @param target 目标文件路径* @throws IOException 抛出异常*/public static String convertAudioFiles(String src, String target) throws IOException {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 hzWaveHeader 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 = 16000;//正常速度是8000,这里写成了16000,速度加快一倍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 headerfos.write(h, 0, h.length);//write data streamfis = 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("PCM Convert to MP3 OK!");return "ok";}
}
Java实现的PCM格式音频文件转换WAV格式
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** PCM 转 WAV** @author QC班长* @since 2020-02-02*/
public class PcmToWav {public static void main(String[] agrs) throws Exception {//convertAudioFiles("resource/茯茶素是什么,有什么效果,生产工艺有哪些?.pcm", "resource/茯茶素是什么,有什么效果,生产工艺有哪些?.mp3");convertAudioFiles("tnafcs.pcm", "tnafcs.mp3");}/*** @param src 待转换文件路径* @param target 目标文件路径* @throws IOException 抛出异常*/public static void convertAudioFiles(String src, String target) throws IOException {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 hzWaveHeader header = new WaveHeader();//长度字段 = 内容的大小(PCMSize) + 头部字段的大小(不包括前面4字节的标识符RIFF以及fileLength本身的4字节)header.fileLength = PCMSize + (44 - 8);header.FmtHdrLeth = 16;header.BitsPerSample = 16;header.Channels = 2;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 headerfos.write(h, 0, h.length);// write data streamfis = 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!");}
}
WaveHeader类
import java.io.ByteArrayOutputStream;
import java.io.IOException;/*** WaveHeader** @author QC班长* @since 2020-04-03*/
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 (char c : id) {bos.write(c);}}}
Java实现PCM格式音频转MP3或WAV相关推荐
- java后台 amr格式音频转为mp3格式
最近项目用到读取amr格式的音频,但是h5不支持这种格式,前台处理不太擅长感觉太过麻烦,所以还是在后端转格式吧. 用到一个jar: jave.jar 网址:https://www.sauronsoft ...
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...
- AudioTrack播放pcm格式音频
AudioTrack播放pcm格式音频 package com.zero.demo;import android.content.Context; import android.media.Audio ...
- 如何将m4a格式音频转为mp3?
如何将m4a格式音频转为mp3?如果你是苹果手机用户,那么你可能会发现一个问题,当我们将苹果手机的录音文件放到其它设备上时,可能会出现无法打开播放的情况,这是因为格式不被兼容的原因所引起的.苹果手机的 ...
- window API播放pcm格式音频文件,函数waveOutOpen等
之前在我的博客中有一篇关于编写录音器的代码,可保存为pcm和wav格式,说白了其实两者是一个东西,只不过wav比pcm多了一个文件头,这个文件头一共占了44个字节.此处这个不是重点,重点是如何编写程序 ...
- 如何把WAV格式音频转换为MP3格式
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被W ...
- 【转】PCM Audio,PCM格式音频文件 详解
PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志.Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV ...
- amr格式音频转为mp3格式
最近项目用到读取amr格式的音频,但是h5不支持这种格式,网上有一些是通过插件的方式来读取,amrlib.js之类,但是不擅长前端,而且有一些插件是要求把文件转为base64编码格式,然后把这些bas ...
- java把pcm文件转换成mp3文件
要将 PCM 文件转换为 MP3 文件,您可以使用 Java 实现.下面是一个可以将 PCM 文件转换为 MP3 文件的示例代码: import java.io.BufferedInputStream ...
最新文章
- 〖Linux〗使用Qt5.2.0开发Android的NDK应用程序
- SSH隧道 / SSH穿透
- mysql中如何把字符串转换成日期类型
- Python 音频数据扩充的技巧
- SAP Spartacus Unit List树形数据的加载
- hana s4 服务器_玩转HANA数据库的备份与恢复
- 数据科学、人工智能TED演讲TOP 10
- 制作centos的启动盘
- ssh+json开发实例
- Android之帮助文档
- coco 数据集_如何用 coco 数据集训练 Detectron2 模型?
- composer 的快速安装
- java过滤器是用来干什么的_java过滤器有什么作用
- SCDM学习笔记(5)
- 《2020国内WAF产品研究报告》
- Docker常用命令(启动、镜像相关、容器相关、文件拷贝、目录挂载、查看容器IP地址、Docker备份与恢复)
- 北京南天软件java工程师面试题
- 2021年全球工业齿轮电机和驱动装置收入大约16590百万美元,预计2028年达到24520百万美元
- AD铺铜中用铺铜管理器进行铺地
- 两种动态灰狼优化算法
热门文章
- PHP实现拼车平台数据表
- 基于TEC1-12706半导体制冷片的微型“小冰箱”
- 《中文新闻信息分类标准》编制原则
- 大数据预言帝现身 猜奥斯卡奖24中21
- 接口自动化测试框架开发 | Pytest+Allure+AIOHTTP+用例自动生成
- 转发:很好理解流形学习的文章-浅谈流形学习(Manifold Learning)
- 慢慢了解慢慢深入熟练掌握
- c#调用C++写的dll导出类,如何实现
- fgc java,频繁FGC的真凶原来是它
- html发光loading,Canvas 制作炫酷发光loading动画