Maison  >  Article  >  développement back-end  >  Explication détaillée de la fonction de téléchargement et de téléchargement de la voix WeChat

Explication détaillée de la fonction de téléchargement et de téléchargement de la voix WeChat

巴扎黑
巴扎黑original
2018-05-26 16:50:034321parcourir

Cet article présente principalement l'exemple de code de la fonction de téléchargement et de téléchargement vocal de WeChat. Les amis qui en ont besoin peuvent s'y référer

S'il y a un bouton maintenant

<p class="inp_btn voice_btn active" id="record">
       按住 说话
     </p>

Ce qui suit est la méthode d'appel de WeChat jssdk

var recorder;
var btnRecord = $(&#39;#record&#39;);
var startTime = 0;
var recordTimer = 300;
// 发语音
$.ajax({
  url: &#39;url请求需要微信的一些东西 下面success就是返回的东西&#39;,
  type: &#39;get&#39;,
  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(&#39;touchstart&#39;, function (event) {
        event.preventDefault();
        startTime = new Date().getTime();
        // 延时后录音,避免误操作
        recordTimer = setTimeout(function () {
          wx.startRecord({
            success: function () {
              localStorage.rainAllowRecord = &#39;true&#39;;
              //style="display:block"
              $(".voice_icon").css("display", "block");
            },
            cancel: function () {
              layer.open({
                content: &#39;用户拒绝了录音授权&#39;,
                btn: &#39;确定&#39;,
                shadeClose: false,
              });
            }
          });
        }, 300);
      }).on(&#39;touchend&#39;, 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: &#39;确定&#39;,
                shadeClose: false,
              });
            }
          });
        }
      });
    });
  },
  error: function () { }
})

Méthode pour télécharger la voix

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: &#39;/QyhSpeech/DownLoadVoice&#39;,
          type: &#39;post&#39;,
          data: { serverId: res.serverId, Id: Id },
          dataType: "json",
          success: function (data) {
            if (data.Result == true && data.ResultCode == 1) {
              layer.open({
                content: "录音上传完成!",//data.Message
                btn: &#39;确定&#39;,
                shadeClose: false,
                yes: function (index) {
                  window.location.href = window.location.href;
                }
              });
            }
            else {
              layer.open({
                content: data.Message,
                btn: &#39;确定&#39;,
                shadeClose: false,
              });
            }
          },
          error: function (xhr, errorType, error) {
            layer.open({
              content: error,
              btn: &#39;确定&#39;,
              shadeClose: false,
            });
          }
        });
      }
    });
  }

Méthode appelée en arrière-plan Vous avez besoin d'un ffmpeg.exe à télécharger par vous-même

//下载语音并且转换的方法
    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;
    }

Appelez 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 });
      }
    }

Classe 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
{
  /// <summary>
  /// 声音帮助类
  /// </summary>
  public sealed class AudioHelper
  {
    private const string FfmpegUsername = "ffmpeg";
    private const string FfmpegPassword = "it4pl803";
    /// <summary>
    /// 音频转换
    /// </summary>
    /// <param name="ffmpegPath">ffmpeg文件目录</param>
    /// <param name="soruceFilename">源文件</param>
    /// <param name="targetFileName">目标文件</param>
    /// <returns></returns>
    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;
      }
    }
  }
}

La bibliothèque de classes suivante marquée en rouge dans l'article doit être placée dans le dernier lien du article. Ensuite, vous pouvez le mettre directement dans le projet (je l'ai aussi trouvé)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn