微信開發之錄音檔案
一、呼叫微信錄音介面前端
1、獲取微信簽名
使用ajax去後臺獲取微信簽名
2、微信配置
wx.config({
// beta: true,// 必須這麼寫,否則wx.invoke呼叫形式的jsapi會有問題
debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
appId: data.appId, // 必填,企業微信的corpID
timestamp: data.timestamp, // 必填,生成簽名的時間戳
nonceStr: data.nonceStr, // 必填,生成簽名的隨機串
signature: data.signature,// 必填,簽名,見附錄1
jsApiList: ['startRecord','stopRecord','playVoice','onVoiceRecordEnd','uploadVoice'] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
});
wx.ready(function(){
//按下開始錄音
$("#talk").on('touchstart',function(event){
event.preventDefault();
START = new Date().getTime();
recordTimer = setTimeout(function(){
wx.startRecord({
success: function(){
localStorage.rainAllowRecord = 'true';
$("#start").css("display","block");
},
cancel: function () {
$("#start").css("display","block");
$("#start").html("使用者拒絕授權錄音");
}
});
},300);
});
//鬆手停止錄音
$("#talk").on('touchend',function(event){
event.preventDefault();
END = new Date().getTime();
if((END - START) < 300){
END = 0;
START = 0;
//小於300ms,不錄音
clearTimeout(recordTimer);
}else{
wx.stopRecord({
success: function (res) {
$("#end").css("display","block");
localId = res.localId;
uploadVoice();
},
fail: function (res) {
$("#end").css("display","block");
$("#end").html("錄音失敗!");
alert("失敗"+JSON.stringify(res));
}
});
}
uploadVoice();
});
//播放語音介面
$("#bf").click(function(){
wx.playVoice({
localId: localId // 需要播放的音訊的本地ID,由stopRecord介面獲得
});
})
//監聽錄音自動停止介面
wx.onVoiceRecordEnd({
// 錄音時間超過一分鐘沒有停止的時候會執行 complete 回撥
complete: function (res) {
var localId = res.localId;
}
});
//上傳錄音
function uploadVoice(){
//呼叫微信的上傳錄音介面把本地錄音先上傳到微信的伺服器
//不過,微信只保留3天,而我們需要長期儲存,我們需要把資源從微信伺服器下載到自己的伺服器
wx.uploadVoice({
localId: localId, // 需要上傳的音訊的本地ID,由stopRecord介面獲得
isShowProgressTips: 1, // 預設為1,顯示進度提示
success: function (res) {
//把錄音在微信伺服器上的id(res.serverId)傳送到自己的伺服器供下載。
// data: JSON.stringify(res),
$.ajax({
url: basePath + '/weixin/video_insertVoice.do?serverId='+res.serverId,
type: 'post',
dataType: "json",
success: function (data) {
alert('檔案已經儲存到伺服器!');
},
error: function (xhr, errorType, error) {
console.log(error);
}
});
}
});
}
});
wx.error(function(res){
// config資訊驗證失敗會執行error函式,如簽名過期導致驗證失敗,具體錯誤資訊可以開啟config的debug模式檢視,也可以在返回的res引數中檢視,對於SPA可以在這裡更新簽名。
});
頁面效果如下:
二、微信api的缺陷是儲存的錄音檔案不是mp3格式、而是amr檔案格式
後端需將amr轉換為MP3的格式並上傳到伺服器
//1.呼叫微信提供的介面serverId獲取錄音的InputStream位元組流
public InputStream getInputStream(String mediaId) {
InputStream is = null;
HttpURLConnection http;
try {
String access_token=WxUtil.getAccessToken();
String url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token="+access_token+"&media_id="+serverId;
URL urlGet = new URL(url);
http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必須是get方式請求
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 連線超時30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 讀取超時30秒
http.connect();
// 獲取檔案轉化為byte流
is = http.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return is;
}
//2.將獲取到的位元組流儲存為amr檔案
public String downloadMediaId( String mediaId,String savePath) {
String relfilePath = null;
InputStream inputStream = getInputStream(mediaId);
FileOutputStream fileOutputStream = null;
try {
//伺服器資源儲存路徑
//臨時路徑
//String path=TemplateUtil.getTempPath();
//String savePath = request.getSession().getServletContext().getRealPath("/") + "upload/" + DateUtil.getYear(new Date()) + "/wxmedia/audio/";
//savePath = savePath + "audio/";
String filename = String.valueOf(System.currentTimeMillis()) + ".amr";
relfilePath = savePath + filename;
File file = new File(savePath);
if (!file.exists()) {
file.mkdirs();
}
byte[] data = new byte[1024];
int len = 0;
fileOutputStream = new FileOutputStream(savePath + filename);
while ((len = inputStream.read(data)) != -1) {
// 判斷結果是否有錯
if (new String(data).indexOf("errmsg") > -1) {
return null;
}
fileOutputStream.write(data, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return relfilePath;
}
/**
* @author yfc
* @createTime 2019年6月27日 下午2:29:34
* @description 4、音訊存入,將MP3檔案上傳至伺服器
*/
public void insertVoice(){
logger.info("================================臨時檔案路徑:"+TemplateUtil.getTempPath());
String sourcePath="d:/upload/a.mp3";
String savepath=request.getSession().getServletContext().getRealPath("/") + "upload/" + DateUtil.getYear(new Date()) + "/wxmedia/audio/";
logger.info("================================savepath:"+savepath);
logger.info("================================serverId"+serverId);
//目標路徑
String targetPath=downloadMediaId(serverId,savepath);
logger.info("================================targetPath:"+targetPath);
//arm轉MP3
changeToMp3(targetPath, sourcePath);
try {
File fileName=new File(sourcePath);
FileInputStream file;
file = new FileInputStream(fileName);
String path=FileStoreService.uploadFile("voice",System.currentTimeMillis()+".mp3" , file);
logger.info("================================path:"+path);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
String path1 = "D:/upload/1562649533821.amr";
String path2 = "D:/upload/a.mp3";
changeToMp3(path1, path2);
}
//3、將amr檔案轉換為mp3格式
public static void changeToMp3(String sourcePath, String targetPath) {
File source = new File(sourcePath);
File target = new File(targetPath);
AudioAttributes audio = new AudioAttributes();
Encoder encoder = new Encoder();
audio.setCodec("libmp3lame");
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);
try {
encoder.encode(source, target, attrs);
} catch (Exception e) {
e.printStackTrace();
}
}
三、依賴jar包
<!--amr檔案轉音訊map檔案-->
<dependency>
<groupId>com.github.dadiyang</groupId>
<artifactId>jave</artifactId>
<version>1.0.3</version>
</dependency>
相關文章
- 音訊開發之錄製播放pcm檔案音訊
- 微信下載錄音檔案(音軌分離 ffmpeg視訊合成)
- 微信開發 檔案上傳
- Android音訊開發之AudioRecord錄音實現Android音訊
- 微信開發系列之七 - 使用Redis儲存微信聊天記錄Redis
- 微信小程式開發之——比較數字大小-配置檔案(2.4)微信小程式
- 尋找(下載)微信音訊檔案音訊
- 微信開發之網頁中加入視訊和音訊網頁音訊
- 微信小遊戲開發(11)-檔案系統遊戲開發
- 微信小程式開發—專案實戰之計算器開發微信小程式
- 微信使用touchstart錄音,安卓觸發不靈敏安卓
- 微信開發之微信域名防封介面
- 原生微信小程式開發記錄微信小程式
- iOS 開發之解析Json檔案iOSJSON
- 如何下載微信公眾號的音訊檔案音訊
- 微信小遊戲開發(10)-音訊播放遊戲開發音訊
- 微信開發之JSSDK介面開發(Java)JSJava
- 仿微信錄音控制元件Demo控制元件
- iOS開發:音訊播放、錄音、視訊播放、拍照、視訊錄製iOS音訊
- Android安全開發之ZIP檔案目錄遍歷Android
- 小米手機怎麼匯出錄音檔案?小米手機錄音匯出方法
- 微信開發之公眾號
- iOS開發之微信山寨版iOS
- 05 python開發之檔案處理Python
- 教你如何下載微信公眾號的音訊檔案音訊
- 檔案包含之銘感目錄
- 【秒懂音視訊開發】08_音訊錄製音訊
- php檔案操作之提取檔案/目錄的名稱PHP
- php 微信開發之 微信支付 v3 配置PHP
- python如何開啟音樂檔案Python
- PC 和開發板之間傳輸檔案
- PHP開發之檔案的上傳下載PHP
- 微信小程式開發—專案實戰之聊天機器人微信小程式機器人
- iOS開發系列--音訊播放、錄音、視訊播放、拍照、視訊錄製(轉)iOS音訊
- 微信開發之自定義元件(Toast)元件AST
- Android WebView 實現檔案選擇、拍照、錄製視訊、錄音AndroidWebView
- 微信小程式開發 -- 通過雲函式下載任意檔案微信小程式函式
- 微信iOS收款到賬語音提醒開發總結iOS