當(dāng)前位置:首頁 > IT技術(shù) > 微信平臺(tái) > 正文

小程序API錄音后Silk格式轉(zhuǎn)碼MP3
2021-07-24 13:52:59

問題

  客戶端使用小程序,需要錄音功能然后到后臺(tái)頁面播放,由于微信提供的錄音API壓縮后的格式為 .silk格式的,但是這個(gè)格式其他播放器都是播放不了的,更何況html頁面的audio標(biāo)簽更是不可能播放了,所以我們需要將.silk格式轉(zhuǎn)碼到mp3格式,因?yàn)閙p3格式是最流行的音頻格式,不管手機(jī)音樂還是其他方面,MP3格式都是很經(jīng)??吹降?

前言

  遍尋網(wǎng)絡(luò),只此一家將.silk轉(zhuǎn)碼到mp3的開源項(xiàng)目,可以說這兄弟非常牛了, github地址:?https://github.com/kn007/silk-v3-decoder??此牛的blog:?https://kn007.net/

為什么寫這篇文章呢,大概有兩點(diǎn).

  1. 就是要記錄一下編程路上遇到的坑,保證以后不會(huì)再犯或者說以后犯了也可以很快找到問題所在并解決問題.
  2. 就是此牛的readme寫的不太好,第一次看都看不太懂,我在這里下了好大功夫,因?yàn)槲也寺?這東西的確沒技術(shù)含量...對(duì),就因?yàn)槲也寺?..
解決方案

軟件解碼轉(zhuǎn)碼

  1. 去github下載此牛提供的插件
    1. 下載后這個(gè)樣子小程序API錄音后Silk格式轉(zhuǎn)碼MP3_干貨
  2. 打開windows文件夾,看到在windows平臺(tái)下的插件合集
    1. silk2mp3.exe是主程序,我們可以用此用戶交互界面進(jìn)行解碼轉(zhuǎn)碼
  3. 打開主程序?qū)胄枰D(zhuǎn)碼文件開始轉(zhuǎn)換
    1. 小程序API錄音后Silk格式轉(zhuǎn)碼MP3_干貨_02

      ?

  4. 轉(zhuǎn)換成功后便在輸出目錄顯示了.mp3格式的文件,然后你就可以播放了!
    1. 此處注意幾個(gè)坑! ? 因?yàn)?silk是騰訊壓縮后的格式,自然是不會(huì)特別大,一搬幾百k就ok了,如果你轉(zhuǎn)碼過程中非常緩慢(超過10秒),或者轉(zhuǎn)換后的文件體積過于龐大(我源文件500kb,開始是轉(zhuǎn)成pcm后250多兆,又轉(zhuǎn)成mp3后成了95兆)這種情況一律都是.silk源文件損壞或者不是標(biāo)準(zhǔn)的.silk文件導(dǎo)致的,你應(yīng)該看一下這個(gè)文件從哪里來的,復(fù)制導(dǎo)入的時(shí)候有沒有損壞跡象,如果你的音頻文件是通過網(wǎng)絡(luò)上傳并且用編程語言寫入到磁盤的,那么你就應(yīng)該著重看并且仔細(xì)的看一下你的IO代碼.八成就是這里出錯(cuò)了.(比如我,就是IO寫錯(cuò)了,導(dǎo)致浪費(fèi)了太多時(shí)間)
  5. 用戶交互界面的轉(zhuǎn)碼到此結(jié)束,你可以聽到你美妙的聲音了.

代碼解碼轉(zhuǎn)碼

  由于是需要客戶端上傳到服務(wù)器并且在后臺(tái)播放,所以肯定需要用代碼的方式實(shí)現(xiàn)解碼轉(zhuǎn)碼咯. 代碼方式也很簡(jiǎn)單,其實(shí)本質(zhì)就是調(diào)用這個(gè)程序,傳幾個(gè)參數(shù)而已.?

  基本的思路就是:

  1. 先將.silk源文件解碼為.pcm文件,具體原因百度即可
  2. 再講.pcm文件轉(zhuǎn)碼到.MP3格式

  那基本步驟就是:

  1. 我直接貼代碼吧,也沒啥好寫的...
小程序API錄音后Silk格式轉(zhuǎn)碼MP3_干貨_03
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:針對(duì)silk文件進(jìn)行轉(zhuǎn)碼工具類
 * 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文件,需要絕對(duì)路徑!! 例:F:zhuanmavg2ub41omgipvrmur1fnssd3tq.silk
     * @param pcm 目標(biāo)pcm文件,需要絕對(duì)路徑!! 例:F:zhuanmavg2ub41omgipvrmur1fnssd3tq.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("轉(zhuǎn)碼到pcm...");
        try
        {
            StringBuilder msg = Lang.execOutput(cmd, Encoding.CHARSET_GBK);
            System.out.println(msg);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }

    /**
     * 轉(zhuǎn)碼為MP3格式
     * @param pcm 源pcm文件,需要絕對(duì)路徑!!  例:F:zhuanmavg2ub41omgipvrmur1fnssd3tq.pcm
     * @param mp3 目標(biāo)mp3文件,需要絕對(duì)路徑!! 例:F:zhuanmavg2ub41omgipvrmur1fnssd3tq.mp3
     * @return
     */
    public static boolean getMp3(String pcm,String mp3){
        boolean flag = true;
        System.out.println("轉(zhuǎn)碼到mp3...");
        try {
            StringBuilder sb = Lang.execOutput("cmd /c F:\開發(fā)工具包\轉(zhuǎn)碼一套\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;
    }
}
小程序API錄音后Silk格式轉(zhuǎn)碼MP3_干貨_03

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >