假如现在有一个按钮
按住 说话
下面就是调用微信jssdk的方法
var recorder;
var btnRecord = $('#record');
var startTime = 0;
var recordTimer = 300;
var url=window.location.href;
// 发语音
$.ajax({
url: 'url请求需要微信的一些东西 下面success就是返回的东西',
type: 'get',
data: { url: url },
success: function (data) {
var json = $.parseJSON(data);
//alert(json);
//假设已引入微信jssdk。【支持使用 AMD/CMD 标准模块加载方法加载】
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: json.appid, // 必填,公众号的唯一标识
timestamp: json.timestamp, // 必填,生成签名的时间戳
nonceStr: json.nonceStr, // 必填,生成签名的随机串
signature: json.signature, // 必填,签名,见附录1
jsApiList: [
"startRecord",
"stopRecord",
"onVoiceRecordEnd",
"playVoice",
"pauseVoice",
"stopVoice",
"onVoicePlayEnd",
"uploadVoice",
"downloadVoice",
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function () {
btnRecord.on('touchstart', function (event) {
event.preventDefault();
startTime = new Date().getTime();
// 延时后录音,避免误操作
recordTimer = setTimeout(function () {
wx.startRecord({
success: function () {
localStorage.rainAllowRecord = 'true';
//style="display:block"
$(".voice_icon").css("display", "block");
},
cancel: function () {
layer.open({
content: '用户拒绝了录音授权',
btn: '确定',
shadeClose: false,
});
}
});
}, 300);
}).on('touchend', function (event) {
event.preventDefault();
// 间隔太短
if (new Date().getTime() - startTime < 300) {
startTime = 0;
// 不录音
clearTimeout(recordTimer);
} else { // 松手结束录音
wx.stopRecord({
success: function (res) {
$(".voice_icon").css("display", "none");
voice.localId = res.localId;
// 上传到服务器
uploadVoice();
},
fail: function (res) {
//alert(JSON.stringify(res));
layer.open({
content: JSON.stringify(res),
btn: '确定',
shadeClose: false,
});
}
});
}
});
});
},
error: function () { }
})
上传语音的方法
function uploadVoice() {
//调用微信的上传录音接口把本地录音先上传到微信的服务器
//不过,微信只保留3天,而我们需要长期保存,我们需要把资源从微信服务器下载到自己的服务器
wx.uploadVoice({
localId: voice.localId, // 需要上传的音频的本地ID,由stopRecord接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
// alert(JSON.stringify(res));
//把录音在微信服务器上的id(res.serverId)发送到自己的服务器供下载。
voice.serverId = res.serverId;
$.ajax({
url: '/QyhSpeech/DownLoadVoice',
type: 'post',
data: { serverId: res.serverId, Id: Id },
dataType: "json",
success: function (data) {
if (data.Result == true && data.ResultCode == 1) {
layer.open({
content: "录音上传完成!",//data.Message
btn: '确定',
shadeClose: false,
yes: function (index) {
window.location.href = window.location.href;
}
});
}
else {
layer.open({
content: data.Message,
btn: '确定',
shadeClose: false,
});
}
},
error: function (xhr, errorType, error) {
layer.open({
content: error,
btn: '确定',
shadeClose: false,
});
}
});
}
});
}
后台调用的方法 需要一个ffmpeg.exe自行下载
//下载语音并且转换的方法
private string GetVoicePath(string voiceId, string access_token)
{
string voice = "";
try
{
Log.Debug("access_token:", access_token);
//调用downloadmedia方法获得downfile对象
DownloadFile downFile = WeiXin.DownloadMedia(voiceId, access_token);
if (downFile.Stream != null)
{
string fileName = Guid.NewGuid().ToString();
//生成amr文件
string amrPath = Server.MapPath("~/upload/audior/");
if (!Directory.Exists(amrPath))
{
Directory.CreateDirectory(amrPath);
}
string amrFilename = amrPath + fileName + ".amr";
//var ss = GetAMRFileDuration(amrFilename);
//Log.Debug("ss", ss.ToString());
using (FileStream fs = new FileStream(amrFilename, FileMode.Create))
{
byte[] datas = new byte[downFile.Stream.Length];
downFile.Stream.Read(datas, 0, datas.Length);
fs.Write(datas, 0, datas.Length);
}
//转换为mp3文件
string mp3Path = Server.MapPath("~/upload/audio/");
if (!Directory.Exists(mp3Path))
{
Directory.CreateDirectory(mp3Path);
}
string mp3Filename = mp3Path + fileName + ".mp3";
AudioHelper.ConvertToMp3(Server.MapPath("~/ffmpeg/"), amrFilename, mp3Filename);
voice = fileName;
Log.Debug("voice:", voice);
}
}
catch { }
return voice;
}
调用GetVoicePath
//下载微信语音文件
public JsonResult DownLoadVoice()
{
var file = "";
try
{
var serverId = Request["serverId"];//文件的serverId
file = GetVoicePath(serverId, CacheHelper.GetAccessToken());
return Json(new ResultJson { Message = file, Result = true, ResultCode = 1 });
}
catch (Exception ex)
{
return Json(new ResultJson { Message = ex.Message, Result = false, ResultCode = 0 });
}
}
AudioHelper类
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
namespace EYO.Common
{
///
/// 声音帮助类
///
public sealed class AudioHelper
{
private const string FfmpegUsername = "ffmpeg";
private const string FfmpegPassword = "it4pl803";
///
/// 音频转换
///
/// ffmpeg文件目录
/// 源文件
/// 目标文件
///
public static string ConvertToMp3(string ffmpegPath, string soruceFilename, string targetFileName)
{
//string cmd = ffmpegPath + @"\ffmpeg.exe -i " + soruceFilename + " " + targetFileName;
string cmd = ffmpegPath + @"\ffmpeg.exe -i " + soruceFilename + " -ar 44100 -ab 128k " + targetFileName;
return ConvertWithCmd(cmd);
}
private static string ConvertWithCmd(string cmd)
{
try
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.Start();
process.StandardInput.WriteLine(cmd);
process.StandardInput.AutoFlush = true;
Thread.Sleep(1000);
process.StandardInput.WriteLine("exit");
process.WaitForExit();
string outStr = process.StandardOutput.ReadToEnd();
process.Close();
return outStr;
}
catch (Exception ex)
{
return "error" + ex.Message;
}
}
}
}
文中需要 DownloadFile downFile = WeiXin.DownloadMedia(voiceId, access_token); 需要一个类库 到时候直接放到项目里面即可(我也是找到)
http://files.cnblogs.com/files/hbh123/Loogn.WeiXinSDK.rar