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 的相关文章

  • 如何从字节播放mp3?

    有没有办法直接使用python从字节播放mp3 如果没有 我可以将二进制文件转换为不同的音频格式并使二进制文件可播放吗 编辑 以下代码适用于wav文件但不是mp3 from pygame import mixer time mixer pr
  • 通过 Nginx、Django 提供 206 字节范围服务

    我让 Nginx 为我的静态 Django 文件提供服务 该文件在 Gunicorn 上运行 我正在尝试提供 MP3 文件并让它们具有头部 206 以便 Apple 接受它们用于播客 目前 音频文件位于我的静态目录中 并直接通过 Nginx
  • 在php中读取mp3流并回显给客户端

    我想要实现的是一个页面 当客户端连接时 该页面不断地从本地ice cast服务器读取 http 127 0 0 1 8000 stream mp3 并将流回显给客户端 从那里 客户端可以在基本音频标签中播放它
  • 通过socket发送wav文件

    我正在尝试通过套接字发送 wav 文件 我收到错误 TypeError must be string or buffer not instance waveFile wave open WAVE OUTPUT FILENAME rb my
  • 如何在 C# 中读取 ID3 标签并将其写入 MP3? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个库可以在 C 中读取 ID3 标签并将其写入 MP3 我在搜索时实际上看到了几个 有人使用可
  • 将 WAV 转换为 MP3 时音频速度发生变化

    我创建一个WAV PCM to MP3转换器 但输出速度太快了 这是转换编码的代码 FILE pcm fopen in path rb FILE mp3 fopen out path wb int read write const int
  • asp.net 从 mp3 创建波形图像

    我正在寻找一种方法来创建上传到服务器的 mp3 文件的图形波形 经过一番研究 我相信 mp3 需要首先转换为原始格式 但我不知道如何为该声音文件创建 gif 波形格式 90 的声音文件长度超过 60 分钟 我知道这无法在上传后立即完成 需要
  • TagLib-sharp:从 HttpPostedFile 对象读取元数据

    用户将他们的 MP3 发布到我的网站 我想在将文件存储到 CDN 之前从文件中读取元数据 TagLib Sharp 似乎是实现此目的的库 但我看不到任何方法来打开 HttPostedFile 我不想将其保存到磁盘 并检索元数据 有人有关于如
  • ID3v2.3:ETCO 框架事件格式澄清

    根据非正式标准 https web archive org web 20220311010154 https id3 org id3v2 3 0 sec4 6 an ETCO框架是 帧头 十个字节 后面是 a 时间戳格式 一个字节 接下来是
  • 是否可以使用 TagLibSharp 从 MP3 文件中删除 Lyrics3v2 标签?

    我想知道是否可以删除歌词3v2使用 MP3 文件中的标签类型标签库夏普 https github com mono taglib sharp图书馆 This http id3 org Lyrics3v2文档说块条目以单词 开头歌词开始 并以
  • 在 Android 中从 Mp3 检索元数据的最佳方法

    我一直在为 Android 开发一个小型媒体播放器应用程序 我在从音乐文件检索元数据时遇到一些问题 我一直在使用媒体元数据检索器 但事实证明这是相当麻烦的 有谁知道更好的方法来解决这个问题 如果是这样 如何实现这样的方法 我用过JAudio
  • 本地播放 mp3 时 Android MediaPlayer 错误(1, -2147483648)

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

    我正在使用 WasapiLoopbackCapture 捕获音频 format IeeeFloat SampleRate 48000 BitsPerSample 32 我需要将其转换为 muLaw 8Khz 8 位 单声道 最终它将通过 S
  • 如何阻止诱变剂自动更新 ID3 版本?

    当我尝试在 MP3 中嵌入专辑封面时 诱变剂将 ID3 标签更新为版本 2 4 我不希望这样做 因为在 ID3v2 4 中 我的手机 运行 Windows Phone 8 和我的计算机无法识别标签 显然 只需更改mutagen id3 ve
  • iPhone 应用程序需要 AAC 许可证吗?

    AAC 是一种音频编解码器 AAC 旨在成为 MP3 格式的后继者 在相似的比特率下 AAC 通常可以实现比 MP3 更好的音质 维基百科上的 AAC http en wikipedia org wiki Advanced Audio Co
  • 使用软件合成器将 MIDI 文件转换为原始音频

    我正在尝试直接从我的 Android 应用程序动态生成一个小型 MP4 音频 视频文件 我最初的攻击计划 用户输入一些基本的歌曲数据 和弦进行等 应用程序会构建一个 MIDI 文件 该系统为每个和弦构建和弦图 并使用 MIDI 读取器生成与
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • C# 从mp4文件中提取mp3文件

    有没有简单的方法从 mp4 文件中提取 mp3 文件 我已经尝试过更改文件扩展名 但这不允许我编辑 mp3 描述 谢谢你 Use Xabe FFmpeg https xabe net product xabe ffmpeg 它是免费的 非商
  • 使用 Python 访问 MP3 音乐数据

    我正在尝试编写一个 Python 脚本 用于使用歌曲的数据作为比较的基础来搜索重复的 mp3 4 文件 我的情况涉及许多文件名相似但 ID3 标签不同的 mp3 4 文件 起初 我尝试循环并使用 md5 来查找重复文件 忽略文件名 当然 当

随机推荐

  • 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包