【Java】java转换可播放的QQ/微信高质量语音格式,mp3/wav转silk格式(高质量音频),mp3转换amr格式(低质量音频),mp3/wav转pcm(非语音格式)
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(非语音格式)相关推荐
- Java实现鼠标右键快捷保存QQ微信截图和复制的文字
Java实现鼠标右键快捷保存QQ微信截图和复制的文字 首先,我们能实现保存剪贴板内容,以下是我的源代码和解释 import java.awt.*; import java.awt.datatransf ...
- Java前后端分离第三方登录_网站前后端分离情况下如何实现QQ微信等第三方登陆-Fun言...
前言 最近在弄第三方登录,实现起来很简单,就是调几个接口获取个人信息即可,详细了解:maven项目整合QQauth2.0第三方登录详细说明,然后因为本网站是前后端分离的,所以不能再回调接口那里直接跳转 ...
- silk v3 decoder php,解码转换QQ微信的SILK v3编码音频为MP3或其他格式
SILK v3编码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器,Skype后来将其开源.具体可见Wikipedia. 但是现在很难找齐源码,或者说懒得找. 一 ...
- java 微信 qq 登录_拾人牙慧篇之———QQ微信的第三方登录实现
一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...
- Java web项目——音乐播放器
Java web项目--音乐播放器 1,需求分析 ①登录并查看自己的音乐列表 ②从本地上传音乐 ③删除某个音乐 ④删除选中的音乐 ⑤查询音乐(支持模糊查询) ⑥添加音乐到喜欢列表且可进行移除 ⑦可在喜 ...
- 微信大转盘 java_[Java教程]使用CSS3+jquery.js 实现微信抽奖转盘效果
[Java教程]使用CSS3+jquery.js 实现微信抽奖转盘效果 0 2014-03-19 02:00:24 上次发表了一篇 微信抽奖转盘活动-效果源码分析 最近想起了刚接到这个项目时第一时间脑 ...
- java 307跳转_GitHub - yy307/java-weixinlib: 微信公众平台接入
java-weixinlib 微信公众平台接入 使用了jdom作为xml解析输出框架 使用说明: // 接入时 final String TOKEN = "xxx"; String ...
- java channel midi_为Java程序中添加播放MIDI音乐功能
下载本文示例代码 Java在多媒体处理方面的确优势不大,但是我们在程序中有些时候又需要一些音乐做为点缀,如果播放的音乐是wav等波形音频文件,又挺大,所以背景音乐最好就是MIDI了,可是网上很多播放M ...
- Java SpringMVC+H5飞翔的小鸟游戏微信小程序源码
源码介绍 Java SpringMVC+H5飞翔的小鸟游戏微信小程序源码 试验性质的一个微信小程序,用canvas做的一个类似flappy-bird的小游戏. 包含一些基本的功能:躲避障碍物.计分.排 ...
最新文章
- cisco2950交换机密码恢复
- 智能合约和区块链技术:入门指南
- 【Webview相关问题】登陆失败之cookie陷阱
- iOS-runtime通篇详解-上
- 从普通JAVA程序员到阿里P8架构师,他用了六年
- SAP中smartforms参数
- ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来
- 一个命令kill所有符合条件的进程
- 双系统还是虚拟机 linux系统时间,你会选择Mac虚拟机还是双系统
- 神州租车:陆正耀辞任公司董事会主席及非执行董事职务
- linux path_lookup,Linux虚拟文件系统(4)-- 路径名查找
- 0基础入门学PLC,只需掌握好这5个步骤让您从0变精通
- 交换机基础知识点思维导图
- oracle 查询入职年限,计算入职年限员工人数占总人数的百分比
- android剪贴板历史,可能是史上最便捷的剪贴板应用 -- Native Clipboard #Android
- 2021强网杯 LongTimeAgo
- centso系统命令来源查询
- 在浏览器中输入URL(如www.baidu.com)到显示页面经历哪些过程,涉及到哪些协议?
- wingFTP实现访问共享目录
- 【PX4 飞控剖析】05 PIX4 连接QGC 可以烧录固件但是连接不上