最近做语音合成的项目,需要把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相关推荐

  1. java后台 amr格式音频转为mp3格式

    最近项目用到读取amr格式的音频,但是h5不支持这种格式,前台处理不太擅长感觉太过麻烦,所以还是在后端转格式吧. 用到一个jar: jave.jar 网址:https://www.sauronsoft ...

  2. Android 音视频开发(一):PCM 格式音频的播放与采集

    什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...

  3. AudioTrack播放pcm格式音频

    AudioTrack播放pcm格式音频 package com.zero.demo;import android.content.Context; import android.media.Audio ...

  4. 如何将m4a格式音频转为mp3?

    如何将m4a格式音频转为mp3?如果你是苹果手机用户,那么你可能会发现一个问题,当我们将苹果手机的录音文件放到其它设备上时,可能会出现无法打开播放的情况,这是因为格式不被兼容的原因所引起的.苹果手机的 ...

  5. window API播放pcm格式音频文件,函数waveOutOpen等

    之前在我的博客中有一篇关于编写录音器的代码,可保存为pcm和wav格式,说白了其实两者是一个东西,只不过wav比pcm多了一个文件头,这个文件头一共占了44个字节.此处这个不是重点,重点是如何编写程序 ...

  6. 如何把WAV格式音频转换为MP3格式

    WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被W ...

  7. 【转】PCM Audio,PCM格式音频文件 详解

    PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志.Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV ...

  8. amr格式音频转为mp3格式

    最近项目用到读取amr格式的音频,但是h5不支持这种格式,网上有一些是通过插件的方式来读取,amrlib.js之类,但是不擅长前端,而且有一些插件是要求把文件转为base64编码格式,然后把这些bas ...

  9. java把pcm文件转换成mp3文件

    要将 PCM 文件转换为 MP3 文件,您可以使用 Java 实现.下面是一个可以将 PCM 文件转换为 MP3 文件的示例代码: import java.io.BufferedInputStream ...

最新文章

  1. 〖Linux〗使用Qt5.2.0开发Android的NDK应用程序
  2. SSH隧道 / SSH穿透
  3. mysql中如何把字符串转换成日期类型
  4. Python 音频数据扩充的技巧
  5. SAP Spartacus Unit List树形数据的加载
  6. hana s4 服务器_玩转HANA数据库的备份与恢复
  7. 数据科学、人工智能TED演讲TOP 10
  8. 制作centos的启动盘
  9. ssh+json开发实例
  10. Android之帮助文档
  11. coco 数据集_如何用 coco 数据集训练 Detectron2 模型?
  12. composer 的快速安装
  13. java过滤器是用来干什么的_java过滤器有什么作用
  14. SCDM学习笔记(5)
  15. 《2020国内WAF产品研究报告》
  16. Docker常用命令(启动、镜像相关、容器相关、文件拷贝、目录挂载、查看容器IP地址、Docker备份与恢复)
  17. 北京南天软件java工程师面试题
  18. 2021年全球工业齿轮电机和驱动装置收入大约16590百万美元,预计2028年达到24520百万美元
  19. AD铺铜中用铺铜管理器进行铺地
  20. 两种动态灰狼优化算法

热门文章

  1. PHP实现拼车平台数据表
  2. 基于TEC1-12706半导体制冷片的微型“小冰箱”
  3. 《中文新闻信息分类标准》编制原则
  4. 大数据预言帝现身 猜奥斯卡奖24中21
  5. 接口自动化测试框架开发 | Pytest+Allure+AIOHTTP+用例自动生成
  6. 转发:很好理解流形学习的文章-浅谈流形学习(Manifold Learning)
  7. 慢慢了解慢慢深入熟练掌握
  8. c#调用C++写的dll导出类,如何实现
  9. fgc java,频繁FGC的真凶原来是它
  10. html发光loading,Canvas 制作炫酷发光loading动画