微信語音上傳 下載

来源:http://www.cnblogs.com/hbh123/archive/2017/08/15/7368251.html
-Advertisement-
Play Games

假如現在有一個按鈕 <div class="inp_btn voice_btn active" id="record"> 按住 說話 </div> 下麵就是調用微信jssdk的方法 var recorder; var btnRecord = $('#record'); var startTime = ...


假如現在有一個按鈕 

  <div class="inp_btn voice_btn active" id="record">
                按住 說話
            </div>

下麵就是調用微信jssdk的方法

        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: '/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
{
    /// <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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、直接使用C#操作資料庫的類庫ADO.NET ADO.NET使用Connection對象來連接資料庫,使用Command或DataAdapter 對象來執行SQL語句,並將執行的結果返回給DataReader或DataAdapter,然後 再使用取得的DataReader或者DataAdapter ...
  • 泛型集合lisit<>優點1.性能高 對值類型使用非泛型集合類,在把值類型轉換為引用類型,和把引用類型轉換為值類型時,需要進行裝箱和拆箱的操作。裝箱和拆箱的操作很容易實現,但是性能損失較大, 假如使用泛型,就可以避免裝箱和拆箱操作。 此為集合。 ArrayList list=new ArrayLis ...
  • 經歷了很久,.net core 2.0 終於發佈了! 之前一直用的core 1.1,升級了2.0後發現認證的機制(Auth)發生了比較大的變化,在1.1中認證配置是在Configure中完成,而在2.0中,認證配置則是在ConfigureServices中完成,剛好對調了一下。 話不多說,直接看代碼 ...
  • 今天所有開發環境已經遷移到mac OS下的Visual Studio Code + 命令行編譯發佈,而運行伺服器是CentOS7,和windows沒什麼關聯了。 只要你Relese編譯併在本地有一個與伺服器相同的運行環境中運行成功了,遷移到真實伺服器不會有什麼難度。 下麵是遷移到 2.0 版本之後遇 ...
  • asp.net(c#)中String.Empty、NULL、"" 三者到底有啥區別和聯繫? ...
  • 本指南演示了以下 Azure .NET API 的用法,包括設置認證、創建並使用 Azure 存儲、創建並使用 Azure SQL 資料庫、部署虛擬機、從 GitHub 部署 Azure Web 應用。在本教程中完成的所有操作均符合1元試用條件。 開始之前 如果您還沒有 Azure 賬戶,可以申請1 ...
  • 回到目錄 對於在Linq To Entity里使用日期函數需要DbFunctions里的擴展方法,而不能使用.net里的日期函數,因為linq的代碼會被翻譯成SQL發到資料庫端,如你的.net方法對於資料庫是不知道的,所以需要使用DbFunctions里的函數,它是為sqlserver設計的,而如果 ...
  • 目前使用這個框架,搜不到中文資料。 只有英文wiki,翻譯學習摘錄一下。 大部分是機翻的,改了一些地方, 因為博主也是低水平的,標紅的是瞎理解的。 可能會有錯誤的地方,如果有園友發現可以指出。 wiki地址:http://github.com/schotime/NPoco/wiki 第一個查詢: 註 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...