查看: 1769|回复: 0

[.NET开发] 微信语音上传 下载功能实例代码

发表于 2018-1-2 08:00:00

假如现在有一个按钮

  1. <div class="inp_btn voice_btn active" id="record">
  2. 按住 说话
  3. </div>
复制代码

下面就是调用微信jssdk的方法

  1. var recorder;
  2. var btnRecord = $('#record');
  3. var startTime = 0;
  4. var recordTimer = 300;
  5. // 发语音
  6. $.ajax({
  7. url: 'url请求需要微信的一些东西 下面success就是返回的东西',
  8. type: 'get',
  9. data: { url: url },
  10. success: function (data) {
  11. var json = $.parseJSON(data);
  12. //alert(json);
  13. //假设已引入微信jssdk。【支持使用 AMD/CMD 标准模块加载方法加载】
  14. wx.config({
  15. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  16. appId: json.appid, // 必填,公众号的唯一标识
  17. timestamp: json.timestamp, // 必填,生成签名的时间戳
  18. nonceStr: json.nonceStr, // 必填,生成签名的随机串
  19. signature: json.signature, // 必填,签名,见附录1
  20. jsApiList: [
  21. "startRecord",
  22. "stopRecord",
  23. "onVoiceRecordEnd",
  24. "playVoice",
  25. "pauseVoice",
  26. "stopVoice",
  27. "onVoicePlayEnd",
  28. "uploadVoice",
  29. "downloadVoice",
  30. ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  31. });
  32. wx.ready(function () {
  33. btnRecord.on('touchstart', function (event) {
  34. event.preventDefault();
  35. startTime = new Date().getTime();
  36. // 延时后录音,避免误操作
  37. recordTimer = setTimeout(function () {
  38. wx.startRecord({
  39. success: function () {
  40. localStorage.rainAllowRecord = 'true';
  41. //style="display:block"
  42. $(".voice_icon").css("display", "block");
  43. },
  44. cancel: function () {
  45. layer.open({
  46. content: '用户拒绝了录音授权',
  47. btn: '确定',
  48. shadeClose: false,
  49. });
  50. }
  51. });
  52. }, 300);
  53. }).on('touchend', function (event) {
  54. event.preventDefault();
  55. // 间隔太短
  56. if (new Date().getTime() - startTime < 300) {
  57. startTime = 0;
  58. // 不录音
  59. clearTimeout(recordTimer);
  60. } else { // 松手结束录音
  61. wx.stopRecord({
  62. success: function (res) {
  63. $(".voice_icon").css("display", "none");
  64. voice.localId = res.localId;
  65. // 上传到服务器
  66. uploadVoice();
  67. },
  68. fail: function (res) {
  69. //alert(JSON.stringify(res));
  70. layer.open({
  71. content: JSON.stringify(res),
  72. btn: '确定',
  73. shadeClose: false,
  74. });
  75. }
  76. });
  77. }
  78. });
  79. });
  80. },
  81. error: function () { }
  82. })
复制代码

 上传语音的方法 

  1. function uploadVoice() {
  2. //调用微信的上传录音接口把本地录音先上传到微信的服务器
  3. //不过,微信只保留3天,而我们需要长期保存,我们需要把资源从微信服务器下载到自己的服务器
  4. wx.uploadVoice({
  5. localId: voice.localId, // 需要上传的音频的本地ID,由stopRecord接口获得
  6. isShowProgressTips: 1, // 默认为1,显示进度提示
  7. success: function (res) {
  8. // alert(JSON.stringify(res));
  9. //把录音在微信服务器上的id(res.serverId)发送到自己的服务器供下载。
  10. voice.serverId = res.serverId;
  11. $.ajax({
  12. url: '/QyhSpeech/DownLoadVoice',
  13. type: 'post',
  14. data: { serverId: res.serverId, Id: Id },
  15. dataType: "json",
  16. success: function (data) {
  17. if (data.Result == true && data.ResultCode == 1) {
  18. layer.open({
  19. content: "录音上传完成!",//data.Message
  20. btn: '确定',
  21. shadeClose: false,
  22. yes: function (index) {
  23. window.location.href = window.location.href;
  24. }
  25. });
  26. }
  27. else {
  28. layer.open({
  29. content: data.Message,
  30. btn: '确定',
  31. shadeClose: false,
  32. });
  33. }
  34. },
  35. error: function (xhr, errorType, error) {
  36. layer.open({
  37. content: error,
  38. btn: '确定',
  39. shadeClose: false,
  40. });
  41. }
  42. });
  43. }
  44. });
  45. }
复制代码

  后台调用的方法 需要一个ffmpeg.exe自行下载

  1. //下载语音并且转换的方法
  2. private string GetVoicePath(string voiceId, string access_token)
  3. {
  4. string voice = "";
  5. try
  6. {
  7. Log.Debug("access_token:", access_token);
  8. //调用downloadmedia方法获得downfile对象
  9. DownloadFile downFile = WeiXin.DownloadMedia(voiceId, access_token);
  10. if (downFile.Stream != null)
  11. {
  12. string fileName = Guid.NewGuid().ToString();
  13. //生成amr文件
  14. string amrPath = Server.MapPath("~/upload/audior/");
  15. if (!Directory.Exists(amrPath))
  16. {
  17. Directory.CreateDirectory(amrPath);
  18. }
  19. string amrFilename = amrPath + fileName + ".amr";
  20. //var ss = GetAMRFileDuration(amrFilename);
  21. //Log.Debug("ss", ss.ToString());
  22. using (FileStream fs = new FileStream(amrFilename, FileMode.Create))
  23. {
  24. byte[] datas = new byte[downFile.Stream.Length];
  25. downFile.Stream.Read(datas, 0, datas.Length);
  26. fs.Write(datas, 0, datas.Length);
  27. }
  28. //转换为mp3文件
  29. string mp3Path = Server.MapPath("~/upload/audio/");
  30. if (!Directory.Exists(mp3Path))
  31. {
  32. Directory.CreateDirectory(mp3Path);
  33. }
  34. string mp3Filename = mp3Path + fileName + ".mp3";
  35. AudioHelper.ConvertToMp3(Server.MapPath("~/ffmpeg/"), amrFilename, mp3Filename);
  36. voice = fileName;
  37. Log.Debug("voice:", voice);
  38. }
  39. }
  40. catch { }
  41. return voice;
  42. }
复制代码

  调用GetVoicePath

  1. //下载微信语音文件
  2. public JsonResult DownLoadVoice()
  3. {
  4. var file = "";
  5. try
  6. {
  7. var serverId = Request["serverId"];//文件的serverId
  8. file = GetVoicePath(serverId, CacheHelper.GetAccessToken());
  9. return Json(new ResultJson { Message = file, Result = true, ResultCode = 1 });
  10. }
  11. catch (Exception ex)
  12. {
  13. return Json(new ResultJson { Message = ex.Message, Result = false, ResultCode = 0 });
  14. }
  15. }
复制代码

AudioHelper类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using System.Threading;
  8. namespace EYO.Common
  9. {
  10. /// <summary>
  11. /// 声音帮助类
  12. /// </summary>
  13. public sealed class AudioHelper
  14. {
  15. private const string FfmpegUsername = "ffmpeg";
  16. private const string FfmpegPassword = "it4pl803";
  17. /// <summary>
  18. /// 音频转换
  19. /// </summary>
  20. /// <param name="ffmpegPath">ffmpeg文件目录</param>
  21. /// <param name="soruceFilename">源文件</param>
  22. /// <param name="targetFileName">目标文件</param>
  23. /// <returns></returns>
  24. public static string ConvertToMp3(string ffmpegPath, string soruceFilename, string targetFileName)
  25. {
  26. //string cmd = ffmpegPath + @"\ffmpeg.exe -i " + soruceFilename + " " + targetFileName;
  27. string cmd = ffmpegPath + @"\ffmpeg.exe -i " + soruceFilename + " -ar 44100 -ab 128k " + targetFileName;
  28. return ConvertWithCmd(cmd);
  29. }
  30. private static string ConvertWithCmd(string cmd)
  31. {
  32. try
  33. {
  34. System.Diagnostics.Process process = new System.Diagnostics.Process();
  35. process.StartInfo.FileName = "cmd.exe";
  36. process.StartInfo.UseShellExecute = false;
  37. process.StartInfo.CreateNoWindow = true;
  38. process.StartInfo.RedirectStandardInput = true;
  39. process.StartInfo.RedirectStandardOutput = true;
  40. process.StartInfo.RedirectStandardError = true;
  41. process.Start();
  42. process.StandardInput.WriteLine(cmd);
  43. process.StandardInput.AutoFlush = true;
  44. Thread.Sleep(1000);
  45. process.StandardInput.WriteLine("exit");
  46. process.WaitForExit();
  47. string outStr = process.StandardOutput.ReadToEnd();
  48. process.Close();
  49. return outStr;
  50. }
  51. catch (Exception ex)
  52. {
  53. return "error" + ex.Message;
  54. }
  55. }
  56. }
  57. }
复制代码

  文中标记红色的需要以下一个类库 放在文中最后链接里面 到时候直接放到项目里面即可(我也是找到)

总结

以上所述是小编给大家介绍的微信语音上传 下载功能实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对程序员之家网站的支持!



回复

使用道具 举报