微信語音上傳 下載

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...