1、简要

参考各个博主,发现java里mp3转silk的案例真的少,几乎没有,有的都是基于 linux系统的,所以自己研究了下就有了以下代码

tips:mp3转换silk格式,需要先转换成pcm再转换silk才能行,代码仅Windows项目部署

2、首先准备以下转换工具放入项目当中

链接:https://pan.baidu.com/s/1-bwq7lSTJiYdYM9WHAkdKQ
提取码:1234

3、创建工具类AudioUtils,编写代码

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 音频格式转换** @author sqd233*/
public class AudioUtils {/*** 工具地址**/static String path = "lib/silk_converter/";public static void main(String[] args) {// TODO: mp3 转 silktransferAudioSilk("路径\\", "文件名.mp3", false);// TODO: wav 转 silktransferAudioSilk("路径\\", "文件名.wav", false);// TODO: mp3转amrtransferMp3Amr("路径\\文件名.mp3", "路径\\文件名.amr");}/*** MP3/WAV转SILk格式* @param filePath 例:D:\\file\\audio.mp3* @param isSource isSource 是否清空原文件* @return*/public static String transferAudioSilk(String filePath, boolean isSource){Integer index = filePath.lastIndexOf("\\") + 1;return transferAudioSilk(filePath.substring(0, index), filePath.substring(index, filePath.length()), isSource);}/*** MP3/WAV转SILk格式** @param path 文件路径 例:D:\\file\\* @param name 文件名称 例:audio.mp3/audio.wav* @param isSource 是否清空原文件* @return silk文件路径* @throws Exception*/public static String transferAudioSilk(String path, String name, boolean isSource) {try {// 判断后缀格式String suffix = name.split("\\.")[1];if (!suffix.toLowerCase().equals("mp3") && !suffix.toLowerCase().equals("wav")) {throw new ServiceException("文件格式必须是mp3/wav");}String filePath = path + name;File file = new File(filePath);if (!file.exists()) {throw new Exception("文件不存在!");}// 文件名时拼接SimpleDateFormat ttime = new SimpleDateFormat("yyyyMMddhhMMSS");String time = ttime.format(new Date());// 导出的pcm格式路径String pcmPath = path + "PCM_" + time + ".pcm";// 先将mp3/wav转换成pcm格式transferAudioPcm(filePath, pcmPath);// 导出的silk格式路径String silkPath = path + "SILK_" + time + ".silk";// 转换成silk格式transferPcmSilk(pcmPath, silkPath);// 删除pcm文件File pcmFile = new File(pcmPath);if (pcmFile.exists()) {pcmFile.delete();}if (isSource) {File audioFile = new File(filePath);if (audioFile.exists()) {audioFile.delete();}}return silkPath;} catch (Exception e) {e.printStackTrace();}return null;}/*** 调用ffmpeg,wav转 pcm** @param wavPath wav文件地址* @param target  转后文件地址*/public static void transferWavPcm (String wavPath, String target) {// ffmpeg -i input.wav -f s16le -ar 44100 -acodec pcm_s16le output.rawtransferAudioPcm(wavPath, target);}/*** 调用ffmpeg,mp3转 pcm** @param mp3Path mp3文件地址* @param target  转后文件地址*/public static void transferMp3Pcm(String mp3Path, String target) {//ffmpeg -y -i 源文件 -f s16le -ar 24000 -ac 1 转换后文件位置transferAudioPcm(mp3Path, target);}/*** mp3/wav 通用* @param fpath* @param target*/private static void transferAudioPcm(String fpath, String target) {List<String> commend = new ArrayList<String>();commend.add(path + "ffmpeg.exe");commend.add("-y");commend.add("-i");commend.add(fpath);commend.add("-f");commend.add("s16le");commend.add("-ar");commend.add("24000");commend.add("-ac");commend.add("-2");commend.add(target);try {ProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}/*** silk_v3_encoder.exe,转成Silk格式* @param pcmPath pcm 文件地址* @param target  转换后的silk地址* silk_v3_encoder.exe 路径* pcm文件地址* silk输出地址* -Fs_API <Hz>            : API sampling rate in Hz, default: 24000* -Fs_maxInternal <Hz>    : Maximum internal sampling rate in Hz, default: 24000* -packetlength <ms>      : Packet interval in ms, default: 20* -rate <bps>            : Target bitrate;   default: 25000* -loss <perc>          : Uplink loss estimate, in percent (0-100);  default: 0* -complexity <comp>   : Set complexity, 0: low, 1: medium, 2: high; default: 2* -DTX <flag>          : Enable DTX (0/1); default: 0* -quiet               : Print only some basic values* -tencent             : Compatible with QQ/Wechat*/public static void transferPcmSilk(String pcmPath, String target) {Process process = null;try {/**// 1、这一节的,语音长度太长会使音频长度丢失List<String> commend = new ArrayList<>();// 指令,可参照方法注释, 请不要在commend.add()里同时写【-参数 值】commend.add(path + "silk_v3_encoder.exe");commend.add(pcmPath);commend.add(target);commend.add("-tencent");ProcessBuilder builder = new ProcessBuilder();builder.command(commend);process = builder.start();// 如果删除下班这行写process.waitFor() ,太长的语音会阻塞,BufferedReader 打印出来太长的语音也会阻塞process = Runtime.getRuntime().exec("taskkill -f -t -im silk_v3_encoder.exe");*/// 方法2,除了会弹出弹窗,没什么问题 cmd /c 极为重要,执行完毕后会自动关闭process = Runtime.getRuntime().exec("cmd /c start " + path + "silk_v3_encoder.exe "  + pcmPath + " " + target + " -tencent");process .waitFor();Thread.sleep(1000);// 有更好的方法会后续慢慢更新..} catch (Exception e) {e.printStackTrace();} finally {if (process != null) {process.destroy();}}}/*** mp3转amr(低质量qq语音)* @param mp3Path MP3文件地址* @param target 转换后文件地址* return*/public static void transferMp3Amr(String mp3Path, String target) {// 被转换文件地址File source = new File(path);try {if (!source.exists()) {throw new Exception("文件不存在!");}List<String> commend = new ArrayList<String>();commend.add(path + "ffmpeg.exe");commend.add("-y");commend.add("-i");commend.add(mp3Path);commend.add("-ac");commend.add("1");commend.add("-ar");commend.add("8000");commend.add(target);try {ProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();p.waitFor();} catch (Exception e) {e.printStackTrace();}} catch (Exception e) {ErrorLogger.printError("mp3转amr异常", e);}}/*** 一个音频转byte类型的方法* @param filePath* @return*/public static byte[] byteAudio(String filePath) {try {InputStream inStream = new FileInputStream(filePath);ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = inStream.read(buffer)) > 0) {baos.write(buffer, 0, bytesRead);}inStream.close();baos.close();return baos.toByteArray();} catch (Exception e) {e.printStackTrace();}return null;}}

4、其他

非常不建议用AMR格式的,音质非常差

【Java】java转换可播放的QQ/微信高质量语音格式,mp3/wav转silk格式(高质量音频),mp3转换amr格式(低质量音频),mp3/wav转pcm(非语音格式)相关推荐

  1. Java实现鼠标右键快捷保存QQ微信截图和复制的文字

    Java实现鼠标右键快捷保存QQ微信截图和复制的文字 首先,我们能实现保存剪贴板内容,以下是我的源代码和解释 import java.awt.*; import java.awt.datatransf ...

  2. Java前后端分离第三方登录_网站前后端分离情况下如何实现QQ微信等第三方登陆-Fun言...

    前言 最近在弄第三方登录,实现起来很简单,就是调几个接口获取个人信息即可,详细了解:maven项目整合QQauth2.0第三方登录详细说明,然后因为本网站是前后端分离的,所以不能再回调接口那里直接跳转 ...

  3. silk v3 decoder php,解码转换QQ微信的SILK v3编码音频为MP3或其他格式

    SILK v3编码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器,Skype后来将其开源.具体可见Wikipedia. 但是现在很难找齐源码,或者说懒得找. 一 ...

  4. java 微信 qq 登录_拾人牙慧篇之———QQ微信的第三方登录实现

    一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...

  5. Java web项目——音乐播放器

    Java web项目--音乐播放器 1,需求分析 ①登录并查看自己的音乐列表 ②从本地上传音乐 ③删除某个音乐 ④删除选中的音乐 ⑤查询音乐(支持模糊查询) ⑥添加音乐到喜欢列表且可进行移除 ⑦可在喜 ...

  6. 微信大转盘 java_[Java教程]使用CSS3+jquery.js 实现微信抽奖转盘效果

    [Java教程]使用CSS3+jquery.js 实现微信抽奖转盘效果 0 2014-03-19 02:00:24 上次发表了一篇 微信抽奖转盘活动-效果源码分析 最近想起了刚接到这个项目时第一时间脑 ...

  7. java 307跳转_GitHub - yy307/java-weixinlib: 微信公众平台接入

    java-weixinlib 微信公众平台接入 使用了jdom作为xml解析输出框架 使用说明: // 接入时 final String TOKEN = "xxx"; String ...

  8. java channel midi_为Java程序中添加播放MIDI音乐功能

    下载本文示例代码 Java在多媒体处理方面的确优势不大,但是我们在程序中有些时候又需要一些音乐做为点缀,如果播放的音乐是wav等波形音频文件,又挺大,所以背景音乐最好就是MIDI了,可是网上很多播放M ...

  9. Java SpringMVC+H5飞翔的小鸟游戏微信小程序源码

    源码介绍 Java SpringMVC+H5飞翔的小鸟游戏微信小程序源码 试验性质的一个微信小程序,用canvas做的一个类似flappy-bird的小游戏. 包含一些基本的功能:躲避障碍物.计分.排 ...

最新文章

  1. cisco2950交换机密码恢复
  2. 智能合约和区块链技术:入门指南
  3. 【Webview相关问题】登陆失败之cookie陷阱
  4. iOS-runtime通篇详解-上
  5. 从普通JAVA程序员到阿里P8架构师,他用了六年
  6. SAP中smartforms参数
  7. ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来
  8. 一个命令kill所有符合条件的进程
  9. 双系统还是虚拟机 linux系统时间,你会选择Mac虚拟机还是双系统
  10. 神州租车:陆正耀辞任公司董事会主席及非执行董事职务
  11. linux path_lookup,Linux虚拟文件系统(4)-- 路径名查找
  12. 0基础入门学PLC,只需掌握好这5个步骤让您从0变精通
  13. 交换机基础知识点思维导图
  14. oracle 查询入职年限,计算入职年限员工人数占总人数的百分比
  15. android剪贴板历史,可能是史上最便捷的剪贴板应用 -- Native Clipboard #Android
  16. 2021强网杯 LongTimeAgo
  17. centso系统命令来源查询
  18. 在浏览器中输入URL(如www.baidu.com)到显示页面经历哪些过程,涉及到哪些协议?
  19. wingFTP实现访问共享目录
  20. 【PX4 飞控剖析】05 PIX4 连接QGC 可以烧录固件但是连接不上

热门文章

  1. 呼叫中心业务许可证和互联网信息服务ICP许可证可以同时申请吗?
  2. DH算法在密钥交换中的作用简介
  3. 陆俊林计算机组成慕课第一章
  4. 升级 GPU 服务器 cuda 驱动版本指南
  5. 调试汇编程序详细过程
  6. 国密浏览器如何完成SM2国密SSL协议协商
  7. JZOJ4808. 【NOIP2016提高A组五校联考3】书稿
  8. centos7安装ZipArchive
  9. MATLAB GUI 实现串口通信,制作串口助手(教材级别的宝藏内容!!)
  10. CrossApp 官方Demo