個(gè)人語(yǔ)音實(shí)現(xiàn)

title: 個(gè)人語(yǔ)音實(shí)現(xiàn)
date: 2015-11-28 16:09:53
categories: "編程"
tags: [語(yǔ)音, 七牛, 微信JS-SDK, 高校之戀]


此處輸入圖片的描述
此處輸入圖片的描述

自己挖的坑弛作,果然要自己填蝠咆!

由于之前開啟了CRSF,想增強(qiáng)安全性月幌。過了一段時(shí)間,自己吧這事給忘了萝衩,導(dǎo)致JS的ajax消息無(wú)法發(fā)送到后臺(tái)豆村,一直提示400 BAD request驼鞭。找了好久才發(fā)現(xiàn)庶弃,詳情衫贬。

但是也找到個(gè)可以檢測(cè)并且建議的辦法,ajax提供error反饋錯(cuò)誤信息歇攻。

$.ajax({
    url: "/profile/{{ user_id }}",
    type: 'POST',
    data: {data: "failed"},
    error: function(e) { //增加錯(cuò)誤反饋
        console.log(e);
    }
})
.done(function (data) {
    console.log(data);
});

前后端交互

  • 訪問個(gè)人主頁(yè)(wx_config)
  • 微信上傳語(yǔ)音
  • 傳遞mediaId和record_time到后臺(tái)
  • 獲取token從微信下載語(yǔ)音
  • 上傳語(yǔ)音到qiniu(發(fā)起任務(wù)轉(zhuǎn)換amr為mp3)
  • 存儲(chǔ)url+time到數(shù)據(jù)庫(kù)

下載語(yǔ)音

獲取token和ticket

說明一下:兩處需要用到access_token固惯,一是在微信賬號(hào)綁定的域名下使用JS-SDK上傳文件時(shí),通過token來(lái)生成ticket來(lái)初始化JS-SDK掉伏;二是在下載文件時(shí)需要認(rèn)證號(hào)產(chǎn)生的token。

本以為JS-SDK的可以使用未認(rèn)證賬號(hào)來(lái)產(chǎn)生access_token從而產(chǎn)生ticket用于JS端上傳數(shù)據(jù)澳窑,從而避免出現(xiàn)提示“XXXX”需要使用錄音功能斧散。但是下載時(shí)發(fā)現(xiàn),微信會(huì)校驗(yàn)mediaId是否來(lái)自同一個(gè)公眾號(hào)(不校驗(yàn)才怪勒)摊聋。所以上傳和下載必須使用同一個(gè)已認(rèn)證微信公眾號(hào)的APPID和APPSECRET來(lái)產(chǎn)生token鸡捐。

兩個(gè)不同的服務(wù)器都需要token和ticket,為了避免搶走導(dǎo)致一方失效麻裁。一個(gè)服務(wù)器產(chǎn)生token和ticket存于緩存中箍镜,每小時(shí)更新一次(微信限制每天不超過2000次),并提供其他服務(wù)器獲取token和ticket的接口煎源。其他服務(wù)器需要使用直接通過接口獲取即可色迂。

錄音時(shí)間

錄音時(shí)間不需要單獨(dú)存儲(chǔ),直接存儲(chǔ)在audio的鏈接中手销,通過錨點(diǎn)的方式
http://7xogxw.com1.z0.glb.clouddn.com/2015-11-26 23:11:06.709113#time23
每次讀取audio_url歇僧,先分割獲取錄音時(shí)間,url和time分別傳到前端渲染锋拖。

真正的自適應(yīng):關(guān)于圖片诈悍,以后可以通過類似的方式,用錨點(diǎn)記錄圖片的實(shí)際長(zhǎng)寬兽埃,而在前端加載之前侥钳,通過url即可獲取長(zhǎng)寬數(shù)據(jù),從而根據(jù)設(shè)備實(shí)際分辨率柄错,折算合適長(zhǎng)寬并發(fā)起請(qǐng)求舷夺,減少大圖加載緩慢。同時(shí)可以在圖片加載之前就可以生成固定比例的圖片占位符售貌,避免加載過程中出現(xiàn)頁(yè)面跳動(dòng)冕房。

上傳語(yǔ)音

上傳文件

之前已經(jīng)實(shí)現(xiàn)過七牛圖片的上傳,但是當(dāng)初的接口復(fù)雜難用(@Lee 佩服)趁矾,想著要修改之前的上傳接口來(lái)上傳語(yǔ)音文件耙册,我決定還是使用最新qiniu-sdk來(lái)上傳文件,之前圖床是用到過毫捣,使用簡(jiǎn)潔了很多详拙。

但是一個(gè)麻煩的問題帝际,新版本的sdk向下兼容性不是很好,如果使用最新的饶辙,之前的會(huì)報(bào)錯(cuò)蹲诀,具體不知。而要去修改之前的接口和上傳部分代碼弃揽,工作量太大料仗,于是兩個(gè)版本sdk同時(shí)使用,導(dǎo)入新的包為qiniu2粱坤,修改所有引用qiniu位置為qiniu2念搬,OK,一切正常涌矢。

一般情況掖举,直接獲取token上傳數(shù)據(jù),相當(dāng)簡(jiǎn)單娜庇。

import qiniu2
from datetime import datetime
import config
from qiniu2 import BucketManager
import base64

def get_token():
    q = qiniu.Auth(config.QINIU_ACCESS_KEY, config.QINIU_SECRET_KEY)
    token = q.upload_token(config.PIC_BUCKET)
    return token
    
up_token, key = upload.get_token()
ret, info = qiniu2.put_data(up_token, key, resp)
assert ret['key'] == key

格式轉(zhuǎn)換

而微信默認(rèn)amr格式塔次,html不支持。上傳語(yǔ)音需要預(yù)處理名秀,需要policy用于存儲(chǔ)轉(zhuǎn)換的格式励负、另存到位置和名稱等信息來(lái)產(chǎn)生up_token。并且如果policy和put_data中的key相同且bucket相同匕得,即可同名覆蓋熄守,減少空間使用。

這一段單獨(dú)看七牛的文檔你是啥也看不到的耗跛,只告訴你預(yù)處理格式裕照。segmentfault上有七牛程序員入駐,可查到很多東西

def get_token():
    q = qiniu2.Auth(config.QN_ACCESS_KEY, config.QN_SECRET_KEY)
    # 文件名稱
    key = str(datetime.now())
    # 轉(zhuǎn)換格式
    format = "avthumb/ogg"
    # 另存到bucket和對(duì)應(yīng)名稱key
    entry_uri = config.AUDIO_BUCKET + ':' + key
    entry_uri = "saveas/"+ base64.urlsafe_b64encode(entry_uri)
    # 獨(dú)立隊(duì)列audioQueue轉(zhuǎn)換
    policy = {
        "persistentOps": format + "|" + entry_uri,
        "persistentPipeline": "audioQueue"
    }
    token = q.upload_token(config.AUDIO_BUCKET, policy=policy)
    return token, key

up_token, key = upload.get_token()
ret, info = qiniu2.put_data(up_token, key, resp)
assert ret['key'] == key

刪除文件

上傳新的語(yǔ)音的時(shí)候调塌,需要?jiǎng)h除原來(lái)的語(yǔ)音文件晋南。同樣很簡(jiǎn)單,提供需要?jiǎng)h除的問題件的key即可羔砾。

def del_file(upkey):
    q = qiniu2.Auth(config.QN_ACCESS_KEY, config.QN_SECRET_KEY)
    bucket = BucketManager(q)
    ret, info = bucket.delete(config.AUDIO_BUCKET, upkey)
    return ret, info

語(yǔ)音播放

兼容格式

一開始看html的audio標(biāo)簽的時(shí)候负间,默認(rèn)ogg和mp3均可。所以默認(rèn)轉(zhuǎn)換為ogg姜凄。最后iOS上不無(wú)法播放政溃,于是檢查發(fā)現(xiàn)iOS壓根就不兼容ogg格式,最終轉(zhuǎn)換為mp3格式态秧。

  • iOS錄音PC能播放董虱,不是前端、后臺(tái)原因。
  • 確定iOS的微信兼容audio
    全民K哥能播放愤诱,全民K哥的js判斷支持h5則使用audio否則flash云头,而微信支持h5。通過canPlayType屬性即可檢測(cè)淫半。
  • 測(cè)試audio兼容性(如果最早就加入并進(jìn)行檢測(cè)溃槐,前面的都不用折騰)
// 檢測(cè)能否兼容audio
function support_audio(){
    return !!document.createElement('audio').canPlayType;
}
// 檢測(cè)能否兼容ogg
function support_audio_ogg(){
    var elem = document.createElement('audio');
    return elem.canPlayType('audio/ogg; codecs="vorbis"');
}
// 檢測(cè)能否兼容mp3
function support_audio_mp3(){
    var elem = document.createElement('audio');
    return elem.canPlayType('audio/mpeg;');
}

console.log('audio:' + support_audio());
console.log('audio-ogg:'+ support_audio_ogg());
console.log('audio-mp3:'+ support_audio_mp3());

參考:http://www.vnadd.com/25160.htm

  • 使用jsconsole遠(yuǎn)程調(diào)試
    通過該工具可以遠(yuǎn)程查看訪問機(jī)器輸出到console的數(shù)據(jù),即可知道是否兼容科吭。

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昏滴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子对人,更是在濱河造成了極大的恐慌谣殊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件规伐,死亡現(xiàn)場(chǎng)離奇詭異蟹倾,居然都是意外死亡匣缘,警方通過查閱死者的電腦和手機(jī)猖闪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肌厨,“玉大人培慌,你說我怎么就攤上這事「贪郑” “怎么了吵护?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)表鳍。 經(jīng)常有香客問我馅而,道長(zhǎng),這世上最難降的妖魔是什么譬圣? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任瓮恭,我火速辦了婚禮,結(jié)果婚禮上厘熟,老公的妹妹穿的比我還像新娘屯蹦。我一直安慰自己,他們只是感情好绳姨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布登澜。 她就那樣靜靜地躺著,像睡著了一般飘庄。 火紅的嫁衣襯著肌膚如雪脑蠕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天跪削,我揣著相機(jī)與錄音空郊,去河邊找鬼份招。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狞甚,可吹牛的內(nèi)容都是我干的锁摔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼哼审,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谐腰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起涩盾,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤十气,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后春霍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砸西,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年址儒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芹枷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莲趣,死狀恐怖鸳慈,靈堂內(nèi)的尸體忽然破棺而出喧伞,到底是詐尸還是另有隱情,我是刑警寧澤潘鲫,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站溉仑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏彼念。R本人自食惡果不足惜挪圾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一逐沙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吩案,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胧后。三九已至芋浮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壳快,已是汗流浹背纸巷。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眶痰,地道東北人瘤旨。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像竖伯,于是被迫代替她去往敵國(guó)和親存哲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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