微信语音上传下载(NET MVC)

Index.cshtml


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/Scripts/jquery-1.10.2.js"></script>
</head>
<body>
    <div class="inp_btn voice_btn active" id="record">
        按住 说话
    </div>
    <script type="text/javascript">
        var recorder;
        var btnRecord = $('#record');
        var startTime = 0;
        var recordTimer = 300;
        // 发语音
        $.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: '/WechatVoice/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,
                            });
                        }
                    });

                }
            });
        }
    </script>
</body>
</html>

WechatVoiceController.cs

using Loogn.WeiXinSDK;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WuDemo.Common;

namespace WuDemo.Controllers
{
    public class WechatVoiceController : Controller
    {
        // GET: WechatVoice
        public ActionResult Index()
        {
            return View();
        }



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

        }


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

AudioHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;

namespace WuDemo.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;
            }
        }
    }
}

文中需要 DownloadFile downFile = WeiXin.DownloadMedia(voiceId, access_token); 需要一个类库 到时候直接放到项目里面即可(我也是找到)
http://files.cnblogs.com/files/hbh123/Loogn.WeiXinSDK.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值