Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung der Upload- und Download-Funktion von WeChat Voice

Ausführliche Erläuterung der Upload- und Download-Funktion von WeChat Voice

巴扎黑
巴扎黑Original
2018-05-26 16:50:034314Durchsuche

In diesem Artikel wird hauptsächlich der Beispielcode für die Sprach-Upload- und Download-Funktion von WeChat vorgestellt.

Wenn es jetzt eine Schaltfläche gibt

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

Das Folgende ist die Methode zum Aufrufen von 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 () { }
})

Methode zum Hochladen von Stimmen

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

Methode, die im Hintergrund aufgerufen wird. Sie benötigen eine ffmpeg.exe, die Sie selbst herunterladen können

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

//下载微信语音文件
    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-Klasse

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

Die im Artikel rot markierten müssen die folgende Klassenbibliothek in den letzten Link einfügen den Artikel. Dann kannst du ihn direkt in das Projekt einfügen (ich habe ihn auch gefunden)

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Upload- und Download-Funktion von WeChat Voice. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn