java 下mp3 转 pcm、wav

2023-11-08

mp3 转 pcm、wav
由于MP3直接转为wav,容易出现文件大小为0k,时间缩短等问题,这里是通过先将mp3转成pcm,然后在通过pcm转成wav。下面直接上代码。

先引入所需要的jar包

<dependency>
    <groupId>com.googlecode.soundlibs</groupId>
    <artifactId>mp3spi</artifactId>
    <version>1.9.5.4</version>
</dependency>
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class Test2 {
    /**
     * mp3转pcm(8k 16bit)
     * @param mp3filepath
     * @param pcmfilepath
     * @return
     */
    public static boolean Mp3ToPcm(String mp3filepath, String pcmfilepath){
        try {
            //获取文件的音频流,pcm的格式
            AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
            //将音频转化为  pcm的格式保存下来
            AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath));
            return true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取MP3音频流
     * @param mp3filepath
     * @return
     */
    private static AudioInputStream getPcmAudioInputStream(String mp3filepath) {
        File mp3 = new File(mp3filepath);
        AudioInputStream audioInputStream = null;
        AudioFormat targetFormat = null;
        try {
            AudioInputStream in = null;
            //读取音频文件的类
            MpegAudioFileReader mp = new MpegAudioFileReader();
            in = mp.getAudioInputStream(mp3);
            AudioFormat baseFormat = in.getFormat();
            //设定输出格式为pcm格式的音频文件
            targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
                    baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
            //输出到音频
            audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return audioInputStream;
    }
    /**
     * pcm(8k 16bit)转wav(16k 16bit)
     * @param pcmfilepath
     * @param wavfilepath
     * @throws IOException
     */
    public static void pcmToWav(String pcmfilepath,String wavfilepath) throws IOException {
        FileInputStream fis = new FileInputStream(pcmfilepath);
        byte channels = 1;
        int sampleRate = 16000;
        int byteRate = 16*sampleRate*channels/8;
        int datalen = (int)fis.getChannel().size();
        ByteBuffer bb = ByteBuffer.allocate(44);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.put(new byte[] {'R','I','F','F'});//RIFF标记
        bb.putInt(datalen+44-8);//原始数据长度(不包含RIFF和本字段共8个字节)
        bb.put(new byte[] {'W','A','V','E'});//WAVE标记
        bb.put(new byte[] {'f','m','t',' '});//fmt标记
        bb.putInt(16);//“fmt”字段的长度,存储该子块的字节数(不含前面的Subchunk1ID和Subchunk1Size这8个字节)
        bb.putShort((short)1);//存储音频文件的编码格式,PCM其存储值为1
        bb.putShort((short)1);//通道数,单通道(Mono)值为1,双通道(Stereo)值为2
        //采样率
        bb.putInt(sampleRate);
        //音频数据传送速率,采样率*通道数*采样深度/8。(每秒存储的bit数,其值=SampleRate * NumChannels * BitsPerSample/8)
        bb.putInt(byteRate);
        //块对齐/帧大小,NumChannels * BitsPerSample/8
        bb.putShort((short)(1*16/8));
        //pcm数据位数,一般为8,16,32等
        bb.putShort((short)16);
        bb.put(new byte[] {'d','a','t','a'});//data标记
        bb.putInt(datalen);//data数据长度
        byte[] header = bb.array();
        for(int i=0;i<header.length;i++) {
            System.out.printf("%02x ",header[i]);
        }
        ByteBuffer wavbuff = ByteBuffer.allocate(44+datalen);
        wavbuff.put(header);
        byte[] temp = new byte[datalen];
        fis.read(temp);
        wavbuff.put(temp);
        byte[] wavbytes = wavbuff.array();
        FileOutputStream fos = new FileOutputStream(wavfilepath);
        fos.write(wavbytes);
        fos.flush();
        fos.close();
        fis.close();
        System.out.println("finished.");
    }

    public static void main(String[] args) throws IOException {
        String mp3filepath = "F:\\work\\haoyin\\voice\\111.mp3";//mp3文件路径
        String pcmfilepath = "F:\\work\\haoyin\\voice\\111.pcm";//转化后的pcm路径
        String wavfilepath = "F:\\work\\haoyin\\voice\\111.wav";//转化后的wav路径
        Mp3ToPcm(mp3filepath,pcmfilepath);
        pcmToWav(pcmfilepath,wavfilepath);
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 下mp3 转 pcm、wav 的相关文章

  • 在 Python 或 C++ 中单声道播放 Mp3

    我正在编码音乐播放器 https github com fabiomdiniz Gokya 2 The Super Gokya 在 python 中使用 pyqt 我希望它能够单声道播放 mp3 文件 我已经使用 pygame 完成了这一点
  • 在 Windows 2008 Server 中从 MP3/WAV 文件生成视觉(波形)?

    是否有 某处 适用于 Windows 的命令行程序可以从 MP3 WAV 创建 PNG JPEG 视觉效果 EDIT This is a good example of how the image should look like Sox
  • 如何在mp3上实现seek

    我即将进入一个涉及解码 播放 mp3 流的项目 我有一个Java解码器 JLayer 但据我所知它没有搜索功能 我不使用内置播放器 我需要实现我自己的播放器 另外 流是加密的 所以我需要实时解密 解码 不能拥有整个解密文件 那么如何在 mp
  • Pygame Mixer.music 无法读取 mp3 流

    我正在尝试用 Python 制作自己的音乐播放器 在考虑了替代方案之后 我决定使用 pygame 的 Mixer music 来实际播放音频 我以前使用过 pygame 通常用于实际游戏 我一直在寻找 Playsound 直到我意识到我需要
  • 我可以在 ANDROID 中将 mp3 文件转换为文本吗?

    Android 是否支持以下功能 将包含语音的 mp3 文件转换为适当的单词 然后将结果写入 TextView 或 Toast 或其他任何内容 我不是在谈论使用语音识别器 我的意思是 mp3 中的文件必须从 SD 中选取 未实时记录和分析
  • 哪里可以获得纯 C++ Lame MP3 编码器 - PCM 到 MP3 示例?

    所以我需要的只是一个简单的函数来设置它 吃传入的 PCM 速率 例如 接近 44100 的速率 它的通道 例如 2 和位 例如 16 和理想的 128 kb s 速率 另一种则采用 PCM 数据并将其编码为纯 MP3 帧 我知道这看起来像是
  • 将 PCM 波形数据转换为 numpy 数组,反之亦然

    情况 我正在使用 WebRTC 中的 VAD 语音活动检测 WebRTC VAD https github com wiseman py webrtcvad Python 适配器 这示例实现 https github com wiseman
  • 从AVPlayer获取HLS的PCM数据

    这个问题在过去几年里似乎被问过几次 但没有人回答 我正在尝试处理来自 HLS 的 PCM 数据 并且必须使用 AVPlayer 这篇文章利用了本地文件https chritto wordpress com 2013 01 07 proces
  • ffmpeg在特定时间混合音频

    我想将 2 个音频文件混合在一起 一个文件的长度为 2 分钟 另一个文件的长度为 10 秒 我希望两个文件混合 这样仍然可以听到两个声音 我希望这个 10 秒的剪辑恰好在 10 秒的 30 秒处出现 这样它就会在 40 秒处结束 我知道如何
  • 使用 SoX 将 mp3 文件分割为 TIME 秒

    我需要将 mp3 文件分割成片TIME每秒 我试过了mp3splt 但如果输出是 它对我不起作用不到1分钟 是否可以这样做 sox file in mp3 file out mp3 trim START LENGTH 当我不知道mp3文件时
  • 有没有办法从 ios 中的 mp3 中提取嵌入的图像数据

    我知道 mp3 有时包含专辑插图 就我而言 我正在处理播客文件 iOS 有没有办法从 mp3 文件中提取图像数据 MP3 包括播客 通常具有嵌入的元数据 包括艺术品 获取嵌入元数据 对于不在 iTunes 库中的 MP3 的最简单方法是通过
  • 如何从 MP3 ID3 标签中提取专辑封面?

    我可以使用 php 成功从我的 mp3 应用程序中获取 mp3 ID3 标签 我留下了一个巨大的BLOB 我确信这非常简单 但我只需要在正确的方向上得到一些帮助 我想最终得到的是 BLOB 数据已更正 media year implode
  • 如何用C语言播放MP3文件?

    我正在寻找在 C 中播放 MP3 文件的最简单方法 我正在寻找一个库 在其中我可以只调用文件名上的函数 或者一个将运行并退出的可执行文件 请建议 Using FMOD http www fmod org download 跨平台 这应该像这
  • Java - 调整 WAV 文件的播放速度

    我可能很笨 但我似乎找不到解决我的问题的方法 NOTE 我发现很多人报告了这个问题 似乎它是由于较新的 Java 可能是 1 5 而发生的 也许不再支持 SAMPLE RATE 我无法找到任何解决方案 我正在尝试调整 SAMPLE RATE
  • 从头开始创建 mp3 文件 C#

    作为一些实验的一部分 我想到了一些事情 如何在 C 中从头开始创建一个 mp3 文件 这实际上听起来像什么 例如 创建一个播放音符的 mp3 文件 C 或 B 降调 我怎样才能实现这一点 它必须是 mp3 文件 而不是 wav 或其他任何文
  • 本地播放 mp3 时 Android MediaPlayer 错误(1, -2147483648)

    Android 4 4 发布后不久 我的代码自 2 2 以来一直正常工作 突然出现了错误 我的代码将查询音乐数据库中给定的音乐文件 该路径在查询中返回 然后该路径被传递到 MediaPlayer Code String uri conten
  • Android 中的音频交叉淡入淡出

    我正在开发一个媒体播放器用于我的学习目的 我希望在媒体播放器应用程序中具有交叉淡入淡出功能 但我不知道从哪里开始 我尝试在互联网上搜索但没有运气 我使用的是安卓MediaPlayer所有媒体播放器相关操作的类 任何人都知道任何解决方法可以实
  • 如何从 MP3 文件中提取元数据?

    我已经得到了 MP3 文件的文件名 如何从该 MP3 文件中提取元数据 例如艺术家 专辑 专辑图像等 对于 API 级别 10 或更高级别尝试此操作 MediaMetadataRetriever mmr new MediaMetadataR
  • JavaFX MediaPlayer - 音乐在 10 秒后停止

    这是代码 就像标题所说的 音乐在10秒后停止 我在vlc或其他程序中正常播放该文件 持续了5分钟多 public void music String bip src data fjordmusic mp3 Media hit new Med
  • 在下载整个文件之前是否可以知道 MP3 的持续时间?

    这是一个关于MP3文件格式的问题 我一直在寻找一种获得 MP3 持续时间的方法 由于我使用 JLayer SPI 来解码 MP3 我发现在音频源是文件的情况下这是可能的 AudioFileFormat fileFormat AudioSys

随机推荐

  • Web安全之中间件安全

    中间件 中间件 英语 Middleware 又译中间件 中介层 是一类提供系统软件和应用软件之间连接 便于软件各部件之间的沟通的软件 应用软件可以借助中间件在不同的技术架构之间共享信息与资源 中间件位于客户机服务器的操作系统之上 管理着计算
  • Conda安装及使用手册

    Conda 是一个开源的软件包管理系统和环境管理系统 用于安装和管理多个软件包及其依赖项 它可以帮助用户创建虚拟环境 使得不同的项目可以使用不同的软件包和版本 从而避免版本冲突和不兼容性问题 下面是 Conda 的安装和使用步骤 安装 Co
  • 鳄鱼笔记(一) --> C#_入门<--[认识C#]

    c 语言和特点 c 语言及其特点 一 特性 二 认识 net Framework net core 三 个人理解 End c 语言及其特点 一 特性 c 是微软发布的 运行于 net Framework 和 net core 之上的高级语言
  • 面向对象设计的SOLID原则

    S O L I D是面向对象设计和编程 OOD OOP 中几个重要编码原则 Programming Priciple 的首字母缩写 SRP The Single Responsibility Principle 单一责任原则 OCP The
  • matlab练习程序(图像滤波时的边界处理)

    我们在写滤波程序时一般会用矩阵模板与原图像做卷积 这时候在做图像边界的处理是一般都选择忽略边缘 不过要是模板比较大 那么处理的效果就不好了 图像四周就会是原图像 中间才是滤波后的结果 虽然用Matlab的imfilter就能解决 不过还是自
  • 人脸识别对齐,向量搜索

    人脸对齐的概念 1 查找人脸 我们可以使用dlib来查找人脸 也就是所谓的侦测人脸 可以从下面github的地址去拿到models 人脸查找的models dnnFaceDetector dlib cnn face detection mo
  • #cmakedefine真实含义

    cmakedefine 用于configure file 中用于生成头文件的文件中 只有当CMakeLists txt中的同名变量为真时才会在生成的头文件中定义 区别于 define无论何时都会定义
  • 中介者模式-C++实现

    跟我在公司搭的框架好像 MediatorPattern cpp 定义控制台应用程序的入口点 include stdafx h include
  • buck变换器设计matlab_开关电源控制环路设计,非常实用!

    欢迎加入技术交流QQ群 2000人 电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子 新能源干货 行业发展趋势分析 最新产品介绍 众多技术达人与您分享经验 欢迎关注微信公众号 电力电子技术与新能源 M
  • RichErp - vue 使用总结 - data 和 props

    data仅代表自己的内部的状态数据 所以如果一个Component仅仅是自身改变状态 然后把状态反馈给外界的话 理论上说只用data就可以了 显然组件通常不会这样 而是需要一种可进可出的状态 也就是允许外界对组件内部的数据进行修改 同时组件
  • R语言的pairs函数和ggpairs函数在数据可视化中扮演着重要的角色,能够实现散点图矩阵图的可视化

    R语言的pairs函数和ggpairs函数在数据可视化中扮演着重要的角色 能够实现散点图矩阵图的可视化 本文将介绍这两个函数的用法 并通过源代码演示如何使用它们进行数据可视化 1 R语言的pairs函数 pairs函数是R语言中一个强大的数
  • React 进阶: useSyncExternalStore API 外部状态管理

    React 进阶 useSyncExternalStore API 外部状态管理 文章目录 React 进阶 useSyncExternalStore API 外部状态管理 完整代码示例 动机 关于状态的思考 方案一 自行接入外部状态 外部
  • 分类器概念篇

    分类器是数据挖掘中对样本进行分类的方法的统称 包含决策树 逻辑回归 朴素贝叶斯 神经网络等 分类器的构造和实施大体会经过以下几个步骤 选定样本 包含正样本和负样本 将所有样本分成训练样本和测试样本两部分 在训练样本上执行分类器算法 生成分类
  • 以违停检测为示例的利用微软云AIOT技术加速项目落地

    AIoT即融合了AI 人工智能 和IoT 物联网 的技术 图形图像处理是人工智能领域中重要的一个分支 在日常生活中也存在大量基于图形图像的处理的场景 比如交通违章抓拍 基于视觉的司机防疲劳监测 家用摄像机的老人摔倒报警等功能 对于物联网则在
  • Kafka消息分区&producer拦截器&无消息丢失(八)

    上篇文章说了 acks 1代表什么都不管 即使配置了回调也不会起作用 0代表不会等待replic副本里的不会持久化 只要broker leader持久化成功则返回给producer 1代表all 则表示全部持久化成功才返回成功给produc
  • dubbo分布式日志跟踪

    dubbo分布式日志追踪 需要修改两个地方 一个是consumer端的 InvokerInvocationHandler java 红色是修改的地方 public class InvokerInvocationHandler impleme
  • 微服务项目打包时指定jar包复制到同一文件夹下

    转载于原文 在项目最外层pom文件中指定文件存放位置
  • 密码学技术如何选型?再探工程能力边界的安全模型|第5论

    作者 李昊轩 来源 微众银行区块链 牢不可破的密码学算法也怕物理攻击 物理信号泄露为何会威胁到隐私保护的效果 隐私保护方案对部署环境有何讲究 不可信执行环境下如何设计隐私保护方案 这里 我们将继续安全模型的分析 由隐私保护技术方案中理论层面
  • JMeter 测试脚本编写技巧

    是一款开源软件 用于进行负载测试 性能测试及功能测试 测试人员可以使用 JMeter 编写测试脚本 模拟多种不同的负载情况 从而评估系统的性能和稳定性 以下是编写 JMeter 测试脚本的步骤 第 1 步 创建测试计划 在JMeter中 测
  • java 下mp3 转 pcm、wav

    mp3 转 pcm wav 由于MP3直接转为wav 容易出现文件大小为0k 时间缩短等问题 这里是通过先将mp3转成pcm 然后在通过pcm转成wav 下面直接上代码 先引入所需要的jar包