问题

  客户端使用小程序,需要录音功能然后到后台页面播放,由于微信提供的录音API压缩后的格式为 .silk格式的,但是这个格式其他播放器都是播放不了的,更何况html页面的audio标签更是不可能播放了,所以我们需要将.silk格式转码到mp3格式,因为mp3格式是最流行的音频格式,不管手机音乐还是其他方面,MP3格式都是很经常看到的.

前言

  遍寻网络,只此一家将.silk转码到mp3的开源项目,可以说这兄弟非常牛了, github地址: https://github.com/kn007/silk-v3-decoder  此牛的blog: https://kn007.net/

为什么写这篇文章呢,大概有两点.

  1. 就是要记录一下编程路上遇到的坑,保证以后不会再犯或者说以后犯了也可以很快找到问题所在并解决问题.
  2. 就是此牛的readme写的不太好,第一次看都看不太懂,我在这里下了好大功夫,因为我菜嘛,这东西的确没技术含量...对,就因为我菜嘛...

解决方案

软件解码转码

  1. 去github下载此牛提供的插件
    1. 下载后这个样子
  2. 打开windows文件夹,看到在windows平台下的插件合集
    1. silk2mp3.exe是主程序,我们可以用此用户交互界面进行解码转码
  3. 打开主程序导入需要转码文件开始转换
  4. 转换成功后便在输出目录显示了.mp3格式的文件,然后你就可以播放了!
    1. 此处注意几个坑!   因为.silk是腾讯压缩后的格式,自然是不会特别大,一搬几百k就ok了,如果你转码过程中非常缓慢(超过10秒),或者转换后的文件体积过于庞大(我源文件500kb,开始是转成pcm后250多兆,又转成mp3后成了95兆)这种情况一律都是.silk源文件损坏或者不是标准的.silk文件导致的,你应该看一下这个文件从哪里来的,复制导入的时候有没有损坏迹象,如果你的音频文件是通过网络上传并且用编程语言写入到磁盘的,那么你就应该着重看并且仔细的看一下你的IO代码.八成就是这里出错了.(比如我,就是IO写错了,导致浪费了太多时间)
  5. 用户交互界面的转码到此结束,你可以听到你美妙的声音了.

代码解码转码

  由于是需要客户端上传到服务器并且在后台播放,所以肯定需要用代码的方式实现解码转码咯. 代码方式也很简单,其实本质就是调用这个程序,传几个参数而已.

  基本的思路就是:

  1. 先将.silk源文件解码为.pcm文件,具体原因百度即可
  2. 再讲.pcm文件转码到.MP3格式

  那基本步骤就是:

  1. 我直接贴代码吧,也没啥好写的...
import org.nutz.lang.Encoding;
import org.nutz.lang.Lang; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; /**
* Describe:针对silk文件进行转码工具类
* Author:陆小不离
* Age:Eighteen
* Time:2017年5月27日 10:12:06
*/
public class DeCoder { public static void main(String[] args){ String skil = "F:\\zhuanma\\vg2ub41omgipvrmur1fnssd3tq.silk";
String pcm = "F:\\zhuanma\\vg2ub41omgipvrmur1fnssd3tq.pcm";
String mp3 = "F:\\zhuanma\\vg2ub41omgipvrmur1fnssd3tq.mp3"; boolean b = getPcm(skil,pcm);
System.out.println(b);
if (b)
getMp3(pcm,mp3); } /**
* 解码为pcm格式
* @param silk 源silk文件,需要绝对路径!! 例:F:\zhuanma\vg2ub41omgipvrmur1fnssd3tq.silk
* @param pcm 目标pcm文件,需要绝对路径!! 例:F:\zhuanma\vg2ub41omgipvrmur1fnssd3tq.pcm
* @return
*/
public static boolean getPcm(String silk,String pcm){
boolean flag = true;
String cmd="cmd.exe /c F:\\zhuanma\\silk_v3_decoder.exe "+silk+" "+pcm+" -quiet";
System.out.println("转码到pcm...");
try
{
StringBuilder msg = Lang.execOutput(cmd, Encoding.CHARSET_GBK);
System.out.println(msg);
}
catch (IOException e)
{
e.printStackTrace();
flag = false;
}
return flag;
} /**
* 转码为MP3格式
* @param pcm 源pcm文件,需要绝对路径!! 例:F:\zhuanma\vg2ub41omgipvrmur1fnssd3tq.pcm
* @param mp3 目标mp3文件,需要绝对路径!! 例:F:\zhuanma\vg2ub41omgipvrmur1fnssd3tq.mp3
* @return
*/
public static boolean getMp3(String pcm,String mp3){
boolean flag = true;
System.out.println("转码到mp3...");
try {
StringBuilder sb = Lang.execOutput("cmd /c F:\\开发工具包\\转码一套\\ffmpeg-20170130-cba4f0e-win64-static\\bin\\ffmpeg.exe -y -f s16le -ar 24000 -ac 1 -i "+pcm+" "+mp3+"", Encoding.CHARSET_GBK);
System.out.println(sb);
} catch (IOException e) {
e.printStackTrace();
flag = false;
}
return flag;
}
}

  注意: 我的代码依赖于优秀的国产框架Nutz(http://www.nutzam.com/),非常牛叉的Java框架,涵盖MVC,IOC,AOP,DAO,JSON,Castors,Lang,Resource等等一些非常实用的功能,而且全文档中文!全代码注释中文!在拥有这么多功能的情况下它却只是一个小小的jar,没有任何依赖! 极具Ji情的社区,万能wendal大叔时刻秒回您的问题,为您的项目保驾护航!  还在犹豫什么,这么好的国产,赶紧脱坑吧~

版权所有.转载请注明出处.

小程序API录音后Silk格式转码MP3的更多相关文章

  1. 小程序API录音 微信录音后 Silk格式转码MP3

    http://www.cnblogs.com/wqh17/p/6911748.html

  2. 微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理

    前言: 小程序开发中诸如获取用户手机号码.调起微信支付.领取卡券等api都是会有一定的延迟的.也就是说通过点击按钮调用这些api的时候,从点击按钮调用api,到支付页面或者领取卡券界面展示出来是需要一 ...

  3. 小程序API

    基础: wx.canIUse(string)    boolean wx.canIUse(string schema)   判断小程序的API,回调,参数,组件等是否在当前版本可用. 参数说明 ${A ...

  4. 微信小程序API 文档快速参考索引

    内容那么多,这个页面到底做了什么? 第一:解决微信文档APi文档使用不便: 第二:解决了内容搜索与索引:—— 最好是写成全文索引文档,但是比较需要时间,而且更新是一件麻烦的事:所以以下是直接 连接官网 ...

  5. [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息

    因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...

  6. 微信小程序 API 基础

    其实还有一些组件,没有提,因为那些组件跟 API 的功能差不多,API 可能比他会更好一点: 具体可见官方文档 基础: 判断接口是否可用:wx.canIUse(a) a 代表:接口名字 返回值:布尔 ...

  7. 小程序后台隐藏后 socket 无法重新连接

    小程序后台隐藏后 socket 无法重新连接 连接时 fail 回调函数的事件参数:connectSocket:fail:jsapi has no permission,event=createSoc ...

  8. 小程序 - API 踩坑记录(更新中...)

    API 小程序API结构导览图: 声明: 请尊重博客园原创精神,转载或使用图片请注明: 博主:xing.org1^ 出处:http://www.cnblogs.com/padding1015/

  9. 微信小程序,时间戳和日期格式互相转化

    微信小程序,时间戳转为日期格式 通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils ...

随机推荐

  1. Masonry适配的简单使用

    一.Masonry是什么: 答:是一个很好的三方,用来做适配的 二.怎么使用Masonry 1.先导入头文件 #define MAS_SHORTHAND #define MAS_SHORTHAND_G ...

  2. chrome插件推荐

    分享自己一直在用的chrome插件 1. Adblock Plus 广告屏蔽插件,能够屏蔽YouTube视频广告.Facebook广告.弹出窗口和其他显眼的广告,个人认为非常强大. 2.AutoPag ...

  3. python作业设计:输入用户名密码,认证成功后显示欢迎信息,输错三次后锁定

    作业需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3.判 ...

  4. Selenium1工作原理

    内容主要转自:Selenium工作原理 http://blog.csdn.net/five3/article/details/6790925 简介: Selenium 1.0中可以使用多种语言编程,当 ...

  5. Ubuntu16.04安装NVIDIA驱动时的一些坑与解决方案

    这几天在新购置的笔记本上部署工作环境,在安装NVIDIA驱动的时候遇到了不少坑,重装了很多次,在Ubuntu论坛以及其他资料源看了很多大牛的分析,最终终于解决了一个又一个问题,过程比较艰辛,所以决定写 ...

  6. 时间同步方法及几个可用的NTP服务器地址

    大家都知道计算机电脑的时间是由一块电池供电保持的,而且准确度比较差经常出现走时不准的时候.通过互联网络上发布的一些公用网络时间服务器NTP server,就可以实现自动.定期的同步本机标准时间. 依靠 ...

  7. dispatch_group_t 日常使用注意事项

    一.背景简介平时在进行多线程处理任务时,有时候希望多个任务之间存在着一种联系,希望在所有的任务执行完后做一些总结性处理.那么就可以将多个任务放在一个任务组中进行统一管理.dispatch提供了相应的A ...

  8. IDEA第五章----Git常用技能

    前几篇已经介绍了idea的环境搭建及基础配置常用模板等,这一章我们介绍下idea中git的一些常用技能,包括提交文件,排除提交文件,合并分支,解决冲突,还原代码等等等. 第一节:Git常用技能 Git ...

  9. hdu3829最大独立集

    The zoo have N cats and M dogs, today there are P children visiting the zoo, each child has a like-a ...

  10. Python学习之路-Day2-Python基础3

    Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...