C#音频采集 (笔记)

2023-11-02

  1. using System;    
  2. using System.Collections.Generic;    
  3. using System.Text;    
  4.     
  5. using System.IO;    
  6. using System.Threading;    
  7. using Microsoft.DirectX;    
  8. using Microsoft.DirectX.DirectSound;    
  9. using System.Net.Sockets;    
  10. using System.Net;    
  11.     
  12. namespace MatureVoice    
  13. {    
  14.     class VoiceCapture    
  15.     {    
  16.         private MemoryStream memstream;//内存流    
  17.         private SecondaryBuffer secBuffer;//辅助缓冲区    
  18.         private int iNotifySize = 0;//通知大小    
  19.         private int iBufferSize = 0;//捕捉缓冲区大小     
  20.         private CaptureBuffer capturebuffer;//捕捉缓冲区对象    
  21.         private AutoResetEvent notifyEvent;//通知事件    
  22.         private Thread notifyThread;//通知线程    
  23.         private int iNotifyNum=0;//通知个数    
  24.         private Notify myNotify;//通知对象    
  25.         private Capture capture;//捕捉设备对象    
  26.         private Device PlayDev;//播放设备对象    
  27.         private BufferDescription buffDiscript;    
  28.         private Socket Client;    
  29.         private EndPoint epServer;    
  30.         private int iBufferOffset=0;//捕捉缓冲区位移    
  31.         private IntPtr intptr;//窗口句柄    
  32.     
  33.         public IntPtr Intptr    
  34.         {    
  35.             set    
  36.             {    
  37.                 intptr = value;    
  38.             }    
  39.         }    
  40.     
  41.         public int NotifySize    
  42.         {    
  43.             set    
  44.             {    
  45.                 iNotifySize = value;    
  46.             }    
  47.     
  48.         }    
  49.     
  50.         public int NotifyNum    
  51.         {    
  52.             set    
  53.             {    
  54.                 iNotifyNum = value;    
  55.             }    
  56.         }    
  57.     
  58.         public Socket LocalSocket    
  59.         {    
  60.             set    
  61.             {    
  62.                 Client = value;    
  63.             }    
  64.         }    
  65.     
  66.         public EndPoint RemoteEndPoint    
  67.         {    
  68.             set    
  69.             {    
  70.                 epServer = value;    
  71.             }    
  72.         }    
  73.     
  74.     
  75.         /// <summary>    
  76.         /// 初始化相关操作    
  77.         /// </summary>    
  78.         public void InitVoice()    
  79.         {//初始化声音相关设置:(1)捕捉缓冲区(2)播放缓冲区    
  80.             if (!CreateCaputerDevice())    
  81.             {    
  82.                 throw new Exception();    
  83.             }//建立设备对象    
  84.             CreateCaptureBuffer();//建立缓冲区对象    
  85.             CreateNotification();//设置通知及事件    
  86.             //======(2)==============    
  87.             if (!CreatePlayDevice())    
  88.             {    
  89.                 throw new Exception();    
  90.             }    
  91.             CreateSecondaryBuffer();    
  92.         }    
  93.     
  94.         /// <summary>    
  95.         /// 启动声音采集    
  96.         /// </summary>    
  97.         public void StartVoiceCapture()    
  98.         {    
  99.             capturebuffer.Start(true);//true表示设置缓冲区为循环方式,开始捕捉    
  100.         }    
  101.     
  102.         /// <summary>    
  103.         /// 创建用于播放的音频设备对象    
  104.         /// </summary>    
  105.         /// <returns>创建成功返回true</returns>    
  106.         private bool CreatePlayDevice()    
  107.         {    
  108.             DevicesCollection dc = new DevicesCollection();    
  109.             Guid g;    
  110.             if (dc.Count > 0)    
  111.             {    
  112.                 g = dc[0].DriverGuid;    
  113.             }    
  114.             else    
  115.             { return false; }    
  116.             PlayDev = new Device(g);    
  117.             PlayDev.SetCooperativeLevel(intptr, CooperativeLevel.Normal);    
  118.             return true;    
  119.         }    
  120.     
  121.         /// <summary>    
  122.         /// 创建辅助缓冲区    
  123.         /// </summary>    
  124.         private void CreateSecondaryBuffer()    
  125.         {    
  126.             buffDiscript = new BufferDescription();    
  127.             WaveFormat mWavFormat = SetWaveFormat();    
  128.             buffDiscript.Format = mWavFormat;    
  129.             iNotifySize = mWavFormat.AverageBytesPerSecond / iNotifyNum;//设置通知大小    
  130.             iBufferSize = iNotifyNum * iNotifySize;    
  131.             buffDiscript.BufferBytes = iBufferSize;    
  132.             buffDiscript.ControlPan = true;    
  133.             buffDiscript.ControlFrequency = true;    
  134.             buffDiscript.ControlVolume = true;    
  135.             buffDiscript.GlobalFocus = true;    
  136.             secBuffer = new SecondaryBuffer(buffDiscript, PlayDev);    
  137.             byte[] bytMemory = new byte[100000];    
  138.             memstream = new MemoryStream(bytMemory, 0, 100000, truetrue);    
  139.             //g729 = new G729();    
  140.             //g729.InitalizeEncode();    
  141.             //g729.InitalizeDecode();    
  142.         }    
  143.     
  144.         /// <summary>    
  145.         /// 创建捕捉设备对象    
  146.         /// </summary>    
  147.         /// <returns>如果创建成功返回true</returns>    
  148.         private bool CreateCaputerDevice()    
  149.         {    
  150.             //首先要玫举可用的捕捉设备    
  151.             CaptureDevicesCollection capturedev = new CaptureDevicesCollection();    
  152.             Guid devguid;    
  153.             if (capturedev.Count > 0)    
  154.             {    
  155.                 devguid = capturedev[0].DriverGuid;    
  156.             }    
  157.             else    
  158.             {    
  159.                 System.Windows.Forms.MessageBox.Show("当前没有可用于音频捕捉的设备""系统提示");    
  160.                 return false;    
  161.             }    
  162.             //利用设备GUID来建立一个捕捉设备对象    
  163.             capture = new Capture(devguid);    
  164.             return true;    
  165.         }    
  166.     
  167.         /// <summary>    
  168.         /// 创建捕捉缓冲区对象    
  169.         /// </summary>    
  170.         private void CreateCaptureBuffer()    
  171.         {    
  172.             //想要创建一个捕捉缓冲区必须要两个参数:缓冲区信息(描述这个缓冲区中的格式等),缓冲设备。    
  173.             WaveFormat mWavFormat = SetWaveFormat();    
  174.             CaptureBufferDescription bufferdescription = new CaptureBufferDescription();    
  175.             bufferdescription.Format = mWavFormat;//设置缓冲区要捕捉的数据格式    
  176.             iNotifySize = mWavFormat.AverageBytesPerSecond / iNotifyNum;//1秒的数据量/设置的通知数得到的每个通知大小小于0.2s的数据量,话音延迟小于200ms为优质话音    
  177.             iBufferSize = iNotifyNum * iNotifySize;    
  178.             bufferdescription.BufferBytes = iBufferSize;    
  179.             bufferdescription.ControlEffects = true;    
  180.             bufferdescription.WaveMapped = true;    
  181.             capturebuffer = new CaptureBuffer(bufferdescription, capture);//建立设备缓冲区对象    
  182.     
  183.         }    
  184.     
  185.         //设置通知    
  186.         private void CreateNotification()    
  187.         {    
  188.             BufferPositionNotify[] bpn = new BufferPositionNotify[iNotifyNum];//设置缓冲区通知个数    
  189.             //设置通知事件    
  190.             notifyEvent = new AutoResetEvent(false);    
  191.             notifyThread = new Thread(RecoData);//通知触发事件    
  192.             notifyThread.IsBackground = true;    
  193.             notifyThread.Start();    
  194.             for (int i = 0; i < iNotifyNum; i++)    
  195.             {    
  196.                 bpn[i].Offset = iNotifySize + i * iNotifySize - 1;//设置具体每个的位置    
  197.                 bpn[i].EventNotifyHandle = notifyEvent.Handle;    
  198.             }    
  199.             myNotify = new Notify(capturebuffer);    
  200.             myNotify.SetNotificationPositions(bpn);    
  201.     
  202.         }    
  203.     
  204.         //线程中的事件    
  205.         private void RecoData()    
  206.         {    
  207.             while (true)    
  208.             {    
  209.                 // 等待缓冲区的通知消息    
  210.                 notifyEvent.WaitOne(Timeout.Infinite, true);    
  211.                 // 录制数据    
  212.                 RecordCapturedData(Client,epServer);    
  213.             }    
  214.         }    
  215.     
  216.         //真正转移数据的事件,其实就是把数据传送到网络上去。    
  217.         private void RecordCapturedData(Socket Client,EndPoint epServer )    
  218.         {    
  219.             byte[] capturedata = null;    
  220.             int readpos = 0, capturepos = 0, locksize = 0;    
  221.             capturebuffer.GetCurrentPosition(out capturepos, out readpos);    
  222.             locksize = readpos - iBufferOffset;//这个大小就是我们可以安全读取的大小    
  223.             if (locksize == 0)    
  224.             {    
  225.                 return;    
  226.             }    
  227.             if (locksize < 0)    
  228.             {//因为我们是循环的使用缓冲区,所以有一种情况下为负:当文以载读指针回到第一个通知点,而Ibuffeoffset还在最后一个通知处    
  229.                 locksize += iBufferSize;    
  230.             }    
  231.             capturedata = (byte[])capturebuffer.Read(iBufferOffset, typeof(byte), LockFlag.FromWriteCursor, locksize);    
  232.             //capturedata = g729.Encode(capturedata);//语音编码    
  233.             try    
  234.             {    
  235.                 Client.SendTo(capturedata, epServer);//传送语音    
  236.             }    
  237.             catch    
  238.             {    
  239.                 throw new Exception();    
  240.             }    
  241.             iBufferOffset += capturedata.Length;    
  242.             iBufferOffset %= iBufferSize;//取模是因为缓冲区是循环的。    
  243.         }    
  244.     
  245.     
  246.         private int intPosWrite = 0;//内存流中写指针位移    
  247.         private int intPosPlay = 0;//内存流中播放指针位移    
  248.         private int intNotifySize = 5000;//设置通知大小    
  249.     
  250.         /// <summary>    
  251.         /// 从字节数组中获取音频数据,并进行播放    
  252.         /// </summary>    
  253.         /// <param name="intRecv">字节数组长度</param>    
  254.         /// <param name="bytRecv">包含音频数据的字节数组</param>    
  255.         public void GetVoiceData(int intRecv, byte[] bytRecv)    
  256.         {    
  257.             //intPosWrite指示最新的数据写好后的末尾。intPosPlay指示本次播放开始的位置。    
  258.             if (intPosWrite + intRecv <= memstream.Capacity)    
  259.             {//如果当前写指针所在的位移+将要写入到缓冲区的长度小于缓冲区总大小    
  260.                 if ((intPosWrite - intPosPlay >= 0 && intPosWrite - intPosPlay < intNotifySize) || (intPosWrite - intPosPlay < 0 && intPosWrite - intPosPlay + memstream.Capacity < intNotifySize))    
  261.                 {    
  262.                     memstream.Write(bytRecv, 0, intRecv);    
  263.                     intPosWrite += intRecv;    
  264.     
  265.                 }    
  266.                 else if (intPosWrite - intPosPlay >= 0)    
  267.                 {//先存储一定量的数据,当达到一定数据量时就播放声音。    
  268.                     buffDiscript.BufferBytes = intPosWrite - intPosPlay;//缓冲区大小为播放指针到写指针之间的距离。    
  269.                     SecondaryBuffer sec = new SecondaryBuffer(buffDiscript, PlayDev);//建立一个合适的缓冲区用于播放这段数据。    
  270.                     memstream.Position = intPosPlay;//先将memstream的指针定位到这一次播放开始的位置    
  271.                     sec.Write(0, memstream, intPosWrite - intPosPlay, LockFlag.FromWriteCursor);    
  272.                     sec.Play(0, BufferPlayFlags.Default);    
  273.                     memstream.Position = intPosWrite;//写完后重新将memstream的指针定位到将要写下去的位置。    
  274.                     intPosPlay = intPosWrite;    
  275.                 }    
  276.                 else if (intPosWrite - intPosPlay < 0)    
  277.                 {    
  278.                     buffDiscript.BufferBytes = intPosWrite - intPosPlay + memstream.Capacity;//缓冲区大小为播放指针到写指针之间的距离。    
  279.                     SecondaryBuffer sec = new SecondaryBuffer(buffDiscript, PlayDev);//建立一个合适的缓冲区用于播放这段数据。    
  280.                     memstream.Position = intPosPlay;    
  281.                     sec.Write(0, memstream, memstream.Capacity - intPosPlay, LockFlag.FromWriteCursor);    
  282.                     memstream.Position = 0;    
  283.                     sec.Write(memstream.Capacity - intPosPlay, memstream, intPosWrite, LockFlag.FromWriteCursor);    
  284.                     sec.Play(0, BufferPlayFlags.Default);    
  285.                     memstream.Position = intPosWrite;    
  286.                     intPosPlay = intPosWrite;    
  287.                 }    
  288.             }    
  289.             else    
  290.             {//当数据将要大于memstream可容纳的大小时    
  291.                 int irest = memstream.Capacity - intPosWrite;//memstream中剩下的可容纳的字节数。    
  292.                 memstream.Write(bytRecv, 0, irest);//先写完这个内存流。    
  293.                 memstream.Position = 0;//然后让新的数据从memstream的0位置开始记录    
  294.                 memstream.Write(bytRecv, irest, intRecv - irest);//覆盖旧的数据    
  295.                 intPosWrite = intRecv - irest;//更新写指针位置。写指针指示下一个开始写入的位置而不是上一次结束的位置,因此不用减一    
  296.             }    
  297.         }    
  298.     
  299.         /// <summary>    
  300.         /// 设置音频格式,如采样率等    
  301.         /// </summary>    
  302.         /// <returns>设置完成后的格式</returns>    
  303.         private WaveFormat SetWaveFormat()    
  304.         {    
  305.             WaveFormat format = new WaveFormat();    
  306.             format.FormatTag = WaveFormatTag.Pcm;//设置音频类型    
  307.             format.SamplesPerSecond = 11025;//采样率(单位:赫兹)典型值:11025、22050、44100Hz    
  308.             format.BitsPerSample = 16;//采样位数    
  309.             format.Channels = 1;//声道    
  310.             format.BlockAlign = (short)(format.Channels * (format.BitsPerSample / 8));//单位采样点的字节数    
  311.             format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;    
  312.     
  313.             return format;    
  314.             //按照以上采样规格,可知采样1秒钟的字节数为22050*2=44100B 约为 43K    
  315.         }    
  316.     
  317.         /// <summary>    
  318.         /// 停止语音采集    
  319.         /// </summary>    
  320.         public void Stop()    
  321.         {    
  322.             capturebuffer.Stop();    
  323.             if (notifyEvent != null)    
  324.             {    
  325.                 notifyEvent.Set();    
  326.             }    
  327.             if (notifyThread != null && notifyThread.IsAlive == true)    
  328.             {    
  329.                 notifyThread.Abort();    
  330.             }    
  331.         }    
  332.     }     



from:http://blog.csdn.net/cuoban/article/details/50618851





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#音频采集 (笔记) 的相关文章

  • webrtcvad 安装失败

    倒腾了两个小时终于解决了这个问题 所有办法都试了 只有这个管用 下载安装VC 不要下载那种在线安装的 我试了很多次 都是安装包丢失或损坏 直接复制下面链接去下载 百度网盘链接 https pan baidu com s 1IaqkukMzb
  • 音频系统POP音的原理和解决方法

    音频系统POP音的原理和解决方法 目录 文章目录 音频系统POP音的原理和解决方法 目录 音频IC与功放IC的电源时序与功能模块使能时序 功放IC输入端INP与INN的阻抗匹配 增大VBIAS滤波电容 BTL输出和SE输出 减小输出端耦合电
  • 【C】借助DirectSound进行流的形式无缝播放的例子

    DirectSound是DirectX的一个组件 用于播放声音 BGM等 和DirectMusic不一样 DirectSound用于播放波形声音 WAV无损等 而不是midi音乐 通常大家使用DirectSound是直接把一个声波数据全部载
  • 基于线性预测的语音编码原理解析

    早期的音频系统都是基于声音的模拟信号实现的 在声音的录制 编辑和播放过程中很容易引入各种噪声 从而导致信号的失真 随着信息技术的发展 数字信号处理技术在越来越多领域得到了应用 数字信号更是具备了易于存储和远距离传输 没有累积失真 抗干扰能力
  • C#音频采集 (笔记)

    using System using System Collections Generic using System Text using System IO using System Threading using Microsoft D
  • Flutter音频播放之just_audio

    just audio的使用 just audio 它是一个用于播放音频的 Flutter 插件 安装和导入 just audio 要使用 just audio 库 需要将其添加到项目的 pubspec yaml 文件中 dependenci
  • DirectSound播放PCM(可播放实时采集的音频数据)

    前言 该篇整理的原始来源为http blog csdn net leixiaohua1020 article details 40540147 非常感谢该博主的无私奉献 写了不少关于不同多媒体库的博文 让我这个小白学习到不少 现在将其整理是
  • 音频——WAV 格式详解

    文章目录 WAV 文件格式解析 概述 块解析 RIFF chunk fmt chunk data chunk 示例分析 代码解析 WAV 文件格式解析 概述 wav 文件支持多种不同的比特率 采样率 多声道音频 WAV 文件格式是 Micr
  • python:pydub模块

    一 安装 1 安装模块 pip install pydub 2 安装插件 云盘中下载文件ffmpeg 打开电脑上的控制面板 系统 高级系统设置 环境变量 然后双击path 看到如下的界面 然后点新建会出现一个新建的地址栏 你需要在这个新建地
  • BES 的蓝牙串口SPP数据收发实验

    1
  • BES提示音修改实验

    加v hezkz17 进数字音频系统答疑群 1 普通提示音切换需要注意的 比如切换不同的音频信号源注意先要app audio list clear 然后再切换音频app audio manager sendrequest APP BT ST
  • 六、Audio-ALSA架构中的codec

    一 codec简介 处理器如果既想 听到 外界的声音 又想向外界传达自己的 心声 那么就需要同时用到 DAC 和 ADC 这两款芯片 那是不是买两颗 DAC 和 ADC 芯片就行了呢 答案肯定是可以的 但是音频不单单是能出声 能听到就行 我
  • DirectX编程:利用 DirectSound 录音

    DirectX编程 利用 DirectSound 录音 转载 http www cnblogs com stg609 archive 2008 10 24 1318931 html 花了一阵子 把DirectX安装后自带的帮助文件中的那部分
  • 免费的包噪音网站分享

    免费的包噪音网站分享 现代生活中 噪音扰人 影响健康和情绪 白噪音可以为人们提供放松心情 提高睡眠质量和专注力的帮助 现在有很多免费的白噪音网站可以任意使用和分享 包括海浪声 雨声 蝉鸣声等等 非常适合在办公室 家里或者旅途中使用 本文为您
  • Java把V3音频文件转化为wav文件的算法的代码

    将写内容过程经常用到的内容段做个备份 如下内容内容是关于Java把V3音频文件转化为wav文件的算法的内容 import java io BufferedInputStream import java io BufferedOutputSt
  • FPGA微型板Verilog简单音频

    简单音调生成 该模块通过使用一个计数器生成一个1 kHz的信号 该计数器在CLK的每个刻度上都递增 当计数器达到32 000时 将切换输出BUZZER 并将计数器重置为0 音频输出 使用一个1 k 电阻器和一小段实心线将GPIO引脚P97和
  • 基于音频和文本的多模态语音情感识别(一篇极好的论文,值得一看哦!)

    基于音频和文本的多模态语音情感识别 语音情感识别是一项具有挑战性的任务 在构建性能良好的分类器时 广泛依赖于使用音频功能的模型 本文提出了一种新的深度双循环编码器模型 该模型同时利用文本数据和音频信号来更好地理解语音数据 由于情感对话是由声
  • Android 14 CarAudioService

    文章目录 新功能 AudioMirring oemCarService 新功能 AudioMirring 简单的说就是两个bus输出的是同一个音频数据 构建的流程是 一个输入src的bus 和两个输出dst的bus 通过setParamte
  • 免费音效素材网站,一次性介绍清楚

    不管是在游戏 电影 电视剧 短视频还是音频中 合适的音效能够更好的表达内容和渲染氛围 今天给大家分享几个免费音效素材 感兴趣的话可以接着往下看 一 制片帮素材 找音效 制片帮素材不仅有海量的优质视频素材 还有丰富的音效资源 分类清晰 更重要
  • 免费音效素材网站,一次性介绍清楚

    不管是在游戏 电影 电视剧 短视频还是音频中 合适的音效能够更好的表达内容和渲染氛围 今天给大家分享几个免费音效素材 感兴趣的话可以接着往下看 一 制片帮素材 找音效 制片帮素材不仅有海量的优质视频素材 还有丰富的音效资源 分类清晰 更重要

随机推荐

  • Linux伪文件系统proc

    简介 proc文件系统是一个伪文件系统 用作内核数据结构的接口 它通常安装在 proc 其中大部分文件是只读的 但是有些文件允许更改内核变量 目录 1 常用文件 1 1 监控内存 1 2 监控网络 1 3 查看文件锁 1 4 系统统计数据
  • 【H.264/AVC视频编解码技术详解】十六:帧内预测编码的基本原理

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档
  • Base64加解密__完整版有解释

    提示 本文章纯原创 转载请注明原出处 文章目录 前言 MainActivity代码 activity main代码 前言 关于base64加解密 相信各位也看过许多文章 那么今日我出一份完整版的Androidbase64加解密APP Mai
  • git将本地文件push到阿里云Code:出现Permission denied (publickey)错误

    1 问题出现 将本地的 Git 仓库推送到阿里云 出现错误 Permission denied publickey fatal Could not read from remote repository 2 原因 1 原因是SSH keys
  • selenium通过cookie跳过登录验证码实现登录

    一般做ui自动化面对验证码一直是一个问题 在网上页百度了一些关于验证码的问题 有通过把验证码提取下来通过pytesser tesseract OCR 等库处理 但是这些比较麻烦 还是因为本人比较渣看不懂 后来想到了webapi学过cooki
  • react方法返回html_react渲染markdown内容-使用react-markdown

    在react中渲染markdown内容有很多方法 后端将markdown渲染成html返回给前端进行渲染 react将markdown渲染成html进行渲染 react使用框架直接对markdown进行渲染 最方便的就是使用react使用框
  • 在 Windows 下关闭135/139/445端口的方法

    一 关闭 135端口 第一步 运行dcomcnfg 打开 组件服务 计算机 在 我的电脑 上右键点击 选 属性 然后点默认属性 把 在此计算机上启用分布式COM E 的勾去掉 接着返回到 默认协议 移除 面向连接的 TCP IP 协议 这操
  • VMware虚拟机实用经验总结大全

    1 VMware虚拟机实用经验之支持的Guest OS VMWare支持如下Guest OS MS DOS Win3 1 Win9x Me WinNT Win2000 WinXP Win Net Linux FreeBSD NetWare6
  • Vue学习之起步——浅谈文件系统

    学习前谈 大家都知道 Vue是一个比较火的前端框架 作为一个开发者 我们虽然没必要深究其底层原理 但是 它的 文件系统 执行脉络我们还是得梳理清楚的 首先 Vue启动时会进入 main js 即 main js 是入口文件 import V
  • c语言if语句习题,C语言练习

    C语言练习 D 算法只能被有限的用户使用 18 有如下嵌套的if语句 以下选项中与上述if语句等价的语句是 A k aB B b gt C b C B k aD k a 19 有以下程序 程序运行后的输出结果是 A 0 B 1 C 2 D
  • (一)K8S集群部署——master节点部署

    1 集群配置 本次部署使用三台服务器 master 192 168 0 2 node1 192 168 0 4 node2 192 168 0 14 服务器配置均为 CentOS 7 6 64位 8核 16G 100G 2 master部署
  • Unity 3D 读入本地 xml 文件

    Load and Display XML Data in Unity 3D 如果你能翻墙从 youtube 上就可以看到怎么用 using UnityEngine using System Collections
  • IDM怎么设置下载会更快

    虽然IDM的下载速度已经足够彪悍 其优秀的智能动态文件分段功能和安全的分段下载技术 让大多数下载器都望尘莫及 但贪心的我们总是希望下载速度能更快 实际上 IDM也隐藏了部分功力 并可通过配置设置将隐藏的 功力 发挥出来 一般来说 Inter
  • 基于MFC对话框的Windows服务程序

    最近需求要写个服务程序 部分功能用MFC类库实现将非常方便 因此就没打算使用win32的服务程序 虽然那样对于服务很简单 首先写好mfc的对话框程序 调试什么的 功能也都完成好 这一部分和平常的mfc对话框程序没有差别 之后的服务启动后打开
  • Elasticsearch--索引备份与迁移

    Elasticsearch集群备份 以及在不同集群之间迁移数据 类似mongodb的mongodump功能 Elasticsearch也提供了备份集群中索引数据的策略 snapshot API 它会备份整个集群的当前状态和数据 并保存到集群
  • java操作rabbitmq

    JMS JMS是JavaEE规范中的一种 类比JDBC JMS即Java消息服务 JavaMessage Service 应用程序接口 是一个Java平台中关于面向消息中间件的API很多MQ产 品都实现了JMS规范 但RabbitMQ官方并
  • Rsync的配置与使用

    一 介绍 不想看直接可以跳过 Rsync 是一个远程数据同步工具 可通过 LAN WAN 快速同步多台主机间的文件 Rsync 本来是用以取代rcp 的一个工具 它当前由 rsync samba org 维护 Rsync 使用所谓的 Rsy
  • [Transformer]CSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped Windows

    CSWin Transformer 基于交叉十字形窗口的视觉Transformer框架 Abstract Section I Introduction Section II Related Work Section III Method P
  • 使用数字滤波器处理音频噪声(附Matlab程序)

    本篇文章主要介绍使用窗函数法构造FIR数字滤波器 并且滤除音频文件的噪声 以下为完整的程序 修改一下文件的位置 直接复制应该就可以 1 音频文件的采集与分析 Matlab输入的音频文件需要 wav 文件 可以使用一些软件转换格式 例如酷狗音
  • C#音频采集 (笔记)

    using System using System Collections Generic using System Text using System IO using System Threading using Microsoft D