amr文件在<audio/>標簽播放的解決方案晶通,包括二進制文件頭為#!AMR(AMR-NB)和#!AMR-WB(AMR-WB)的amr文件

demo預(yù)覽圖

一、前言

因為業(yè)務(wù)有這個需求哟玷,之前一直在網(wǎng)上沒有找到好的方法狮辽,搜索了很多的方法及資料才完成,最終用時一坤天巢寡;首先喉脖,需要知道的一些信息:
1、AMR抑月,全稱為Adaptive Multi-Rate(自適應(yīng)多速率)动看,主要用于移動設(shè)備上的音頻壓縮編碼標準。這種格式的音質(zhì)通常較差爪幻,但其壓縮比非常高,特別適用于語音類的音頻壓縮须误,如通話和人聲錄音挨稿。
2、AMR文件格式分為兩種:AMR-NB和AMR-WB【 記住它們的采樣頻率京痢,后面要考 : ) 】

  • AMR-NB(AMR-NarrowBind):語音帶寬范圍:300 - 3700Hz奶甘,8KHz采樣頻率;
  • AMR-WB(AMR-WideBand):語音帶寬范圍50 - 7000Hz祭椰,16KHz采樣頻率臭家;

3、AMR文件一般為錄音文件方淤,并不能直接放在audio標簽上播放钉赁;

二、解決思路

既然不能直接放在audio標簽上播放携茂,那就轉(zhuǎn)換格式你踩,那怎么轉(zhuǎn)換呢?哎~讳苦,有這么一個庫amrnb.js是處理amr格式的带膜,里面有個方法toWAV,沒錯就是你想的那樣鸳谜,就是把amr格式轉(zhuǎn)為wav格式的膝藕,看代碼是處理為Uint8Array數(shù)據(jù),那么用這個Uint8Array數(shù)據(jù)生成一個Blob對象咐扭,在使用URL.createObjectURL(blob)生成一個臨時地址放在audio標簽上不就行了芭挽,思路方法已有滑废,開始實現(xiàn)。


amrnb.js

三览绿、實現(xiàn)

1策严、HTML代碼

引入amrnb.js庫

<script src="js/amrjs/amrnb.js"></script>

通過文件上傳獲取文件

<div>
    <input type="file" onchange="fileChange(event)" accept=".mp3,.wav,.ogg,.amr,.m4a">
</div>
<audio id="audio" src="" controls></audio>
2、JavaScript代碼

用FileReader讀取為ArrayBuffer數(shù)據(jù)轉(zhuǎn)為Uint8Array才能調(diào)用AMR.toWAV將arm格式轉(zhuǎn)換為wav格式:

function fileChange(e) {
    const file = e.target.files[0]
    const audioElement = document.getElementById('audio')
    if (!file) {
        audioElement.src = ''
        return
    }
    const reader = new FileReader()
    reader.onload = function(e) {
        if (file.name.indexOf('.amr') !== -1) {
            const data = new Uint8Array(e.target.result);
            const buffer = AMR.toWAV(data) // amr轉(zhuǎn)wav
            const url = URL.createObjectURL(new Blob([buffer], {
                type: 'audio/x-wav'
            }))
            audioElement.src = url
        } else {
            const buffer = e.target.result
            const url = URL.createObjectURL(new Blob([buffer], {
                type: 'audio/x-wav'
            }))
            audioElement.src = url
        }
    }
    reader.readAsArrayBuffer(file)
}

四饿敲、完全解決了妻导?

不,只解決了一半怀各,有些.amr文件播放不了倔韭,之前說過AMR文件格式有兩種:AMR-NB(#!AMR)和AMR-WB(#!AMR-WB),查看它們的二進制文件頭你會發(fā)現(xiàn)只能播放 #!AMR 的不能播放#!AMR-WB的瓢对,也就是說amrnb.js庫只支持AMR-NB格式的amr文件寿酌,不支持AMR-WB的。


AMR-NB

AMR-WB

五硕蛹、amrwb-js庫

一頓搜索后醇疼,發(fā)現(xiàn)一個amrwb-js庫,但里面沒有toWAV的方法法焰,其他的解碼秧荆、加密方法都有,名稱都一樣埃仪,那能不能用amrnb.js庫的toWAV方法呢乙濒,我復(fù)制拿來試了一下,不行o(╥﹏╥)o卵蛉。


amrwb-js

正當我一籌莫展時颁股,搜索里有個AMR-NB和AMR-WB的介紹引起了我的注意,還記得之前讓你們記住他們的采樣頻率嗎傻丝,8KHz甘有、16KHz,再仔細看了一下toWAV方法里有個變量sample_rate = 8e3葡缰,難道......馬上啊梧疲,很快我把變量值改為sample_rate = 16e3,waoo~ amazing OK了运准,難我天幌氮!


amrnb.js庫的toWAV方法

六、JavaScript最終代碼

<script src="js/amrjs/amrnb.js"></script>
<script src="js/amrjs/amrwb.js"></script>
<script src="js/amrjs/amrwb-util.js"></script>
function fileChange(e) {
    const file = e.target.files[0]
    const audioElement = document.getElementById('audio')
    if (!file) {
        audioElement.src = ''
        return
    }
    const reader = new FileReader()
    reader.onload = function(e) {
        if (file.name.indexOf('.amr') !== -1) {
            const data = new Uint8Array(e.target.result);
            if (AMRWB.getAMRHeader(data) === AMRWB.AMR_HEADER) {
                // #!AMR-WB文件頭
                AMRWB.decodeInit()
                const buffer = AMRWB.toWAV(data) // amr轉(zhuǎn)wav
                AMRWB.decodeExit()
                const url = URL.createObjectURL(new Blob([buffer], {
                                        type: 'audio/wav'
                                }))

                audioElement.src = url
            } else if (AMR.getAMRHeader(data) === AMR.AMR_HEADER){
                // #!AMR文件頭
                const buffer = AMR.toWAV(data) // amr轉(zhuǎn)wav
                const url = URL.createObjectURL(new Blob([buffer], {
                        type: 'audio/x-wav'
                    }))
                audioElement.src = url
            } else {
                alert('文件格式不支持胁澳!')
            }
        } else {
            const buffer = e.target.result
            const url = URL.createObjectURL(new Blob([buffer], {
                type: 'audio/x-wav'
            }))
            audioElement.src = url
        }
    }
    reader.readAsArrayBuffer(file)
}

七该互、完整代碼

https://gitee.com/jias0606/amr-audio-player

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者韭畸。
  • 序言:七十年代末宇智,一起剝皮案震驚了整個濱河市蔓搞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌随橘,老刑警劉巖喂分,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異机蔗,居然都是意外死亡蒲祈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門萝嘁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梆掸,“玉大人,你說我怎么就攤上這事牙言∷崆眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵咱枉,是天一觀的道長卑硫。 經(jīng)常有香客問我,道長蚕断,這世上最難降的妖魔是什么拔恰? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮基括,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘财岔。我一直安慰自己风皿,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布匠璧。 她就那樣靜靜地躺著桐款,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夷恍。 梳的紋絲不亂的頭發(fā)上魔眨,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音酿雪,去河邊找鬼遏暴。 笑死,一個胖子當著我的面吹牛指黎,可吹牛的內(nèi)容都是我干的朋凉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼醋安,長吁一口氣:“原來是場噩夢啊……” “哼杂彭!你這毒婦竟也來了墓毒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亲怠,失蹤者是張志新(化名)和其女友劉穎所计,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體团秽,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡主胧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了徙垫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讥裤。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姻报,靈堂內(nèi)的尸體忽然破棺而出己英,到底是詐尸還是另有隱情,我是刑警寧澤吴旋,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布损肛,位于F島的核電站,受9級特大地震影響荣瑟,放射性物質(zhì)發(fā)生泄漏治拿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一笆焰、第九天 我趴在偏房一處隱蔽的房頂上張望劫谅。 院中可真熱鬧,春花似錦嚷掠、人聲如沸捏检。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贯城。三九已至,卻和暖如春霹娄,著一層夾襖步出監(jiān)牢的瞬間能犯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工犬耻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留踩晶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓枕磁,卻偏偏與公主長得像合瓢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子透典,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容