背景:为什么用到这个类库呢?公司要一个要播放音频文件(.wav)的功能,本来想着很ez的事,网上提供的jq插件、本地也有很多播放器,怎么用都行。可当我实现的时候发现大部分网上插件在火狐上不支持.wav格式,好不容找到几个能实现的但是可以播放从网上下来的任何格式的歌曲音频但是公司的音频播放不了;很纳闷就调用本地.exe播放器结果一样不能播放,百般纳闷后找到音频生产者(Android)问音频是如何录制及生成的~不问不知道一问吓一跳,这是一段特殊音频流文件(没有波行头且已经实现了实时上传和播放功能)。挠头,郁闷,感叹人生好几天想出一招,让安卓端封装个jar包给我,我再将jar包封装DLL或者EXE引用即可...屁颠屁颠找安卓去聊这事,人家爽快答应我后当天下午就告诉我弄不了,音频是AudioTrack插件弄的,离开安卓环境就报错....郁闷...挠头...感叹人生,特么的爪哇能玩的.net应该也能玩才对啊!!;研究了一下午AudioTrack发现它也是PCM流实现的功能,哎,求人不如求己各种摆渡后找到了这个类库,自己写...

  正题:语音聊天过程

  声音的一些术语:

    声道: 单声道、双声道

        对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);

      对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道

    采样位数:8位、16位(2^8与2^16)

    采样频率:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。

          22.05KHz、44.1KHz、48KHz

每个采样数据记录的是振幅, 采样精度取决于储存空间的大小:

1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;

2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;

4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了.

如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍.

这样我们就可以根据一个 wav 文件的大小、采样频率和采样大小估算出一个 wav 文件的播放长度。

譬如 "Windows XP 启动.wav" 的文件长度是 424,644 字节, 它是 "22050HZ / 16bit / 立体声" 格式(这可以从其 "属性->摘要" 里看到),

那么它的每秒的传输速率(位速, 也叫比特率)是 22050*16*2 = 705600(bit/s), 换算成字节单位就是 705600/8 = 88200(字节/秒), 
播放时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。

包装标准的 PCM 格式的 WAVE 文件(*.wav)中至少带有 42 个字节的头信息, 在计算播放时间时应该将其去掉, 
就有:(424644-42) / (22050*16*2/8) ≈ 4.8140816(秒). 这样就比较精确了

  RTP/RTCP协议:百度学习...

  Microsoft.DirectX.DirectSound(简称:DirectSound)工作原理;

  DirectSound使用缓冲区来播放声音,分为:主缓冲区(PrimaryBuffer)、从缓冲区(SecondBuffer)

  PrimaryBuffer:在DirectSound对象创建过程中自动创建(默认格式:22.05Khz/8位/立体声),从缓冲区中的音频数据完成混音后被放入主缓冲区

  SecondBuffer:手动创建,需要将PCM流写入SecondBuffer中,接下去的混音和播放由DirectSound后台完成;

          只要混音运算足够快用户可创建多个SecondBuffer同时播放不同波形音频数据

  

  静态缓冲(StaticBuffer)和流式缓冲(StreamingBuffer)

  DirectSound有多种选择创建不同样式的从缓冲区,从工作原理上看,有两种最为重要和常用:StaticBuffer、StreamingBuffer。

  静态缓冲(StaticBuffer):按波形音频数据大小创建从缓冲区,在播放音频前需要将文件全部写入从缓冲区,数据一次写入后声音可以反复播放;主要用于播放小文件。缺点:占用内存空间过大;即使创建成功,那么在播放前将波形音频数据写入从缓冲区的时间过长对实时播放造成了影响。

  流式缓冲(StreamingBuffer):用于长时间连续的波形音频数据的播放,用户在内存中创建从缓冲区,一般为播放1~2秒数据的长度,然后根据播放速率将波形音频数据定时分片写入从缓冲区的指定位置,就可以实现话音实时播放。主要用于大型波形音频数据的播放或实时采样声音的播放。

  

Microsoft.DirectX.DirectSound学习(一)的更多相关文章

  1. 运用Microsoft.DirectX.DirectSound和Microsoft.DirectX实现简单的录音功能

    1.首先要使用Microsoft.DirectX.DirectSound和Microsoft.DirectX这两个dll进行录音,需要先安装microsoft directx 9.0cz这个组件, 百 ...

  2. Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll引用,导致项目无法调试问题

    最近在做录音功能,用到了Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll两个dll,但是引入后,无法调试项目 具体解决方法: 修改app. ...

  3. C#调用Microsoft.DirectX.DirectSound问题记录及解决

    问题1:初始化结构体WaveFormat或其他变量时卡死 修改App.config,修改方法如下: 原App.config <?xml version="1.0" encod ...

  4. C#调用Microsoft.DirectX.DirectSound.dll时出错

    1.修改工程的编译选项.我的开发运行环境是Windows 10 x64系统.需要修改一下工程的编译选项,把AnyCPU改成x86的. 未能加载文件或程序集“Microsoft.DirectX.Dire ...

  5. 迁移基于Microsoft.DirectX的AudioRecoder类到SharpDX上

    最近迁移项目到x64上,要处理的东西还是蛮多的,所以我要在说一次,不到万不得已不要用COM组件,要用COM组件也得首先考虑不需要我们关心平台的做法,或者得有64位版本. 比如Office的COM组件调 ...

  6. DirectX.DirectSound声音播放资料

    参考:https://msdn.microsoft.com/en-us/library/windows/desktop/bb318665(v=vs.85).aspx Microsoft DirectS ...

  7. DirectSound学习(三)--类、方法、属性翻译

    DirectSound.Device :Contains methods and properties used to create buffer objects, manage devices, a ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图 本章介绍一种在游戏和应用中,模拟动态阴影的基本阴影 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十八章:立方体贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十八章:立方体贴图 代码工程地址: https://github.c ...

随机推荐

  1. SAP BW中的增强(转)

    根据所了解的资料,BW中的有关增强可分为五部分,如下: 1.  数据抽取增强,即在标准数据源中加入数据源中所不存在的字段,或者标准数据源不存在所需数据而需要自定义数据源,相关的事务代码有RSO2(用于 ...

  2. 比较escape、encodeURI、encodeURIComponent

    估计很多前端工程师并不清楚escape,encodeURI, encodeURIComponent的区别,也不知道什么时候该用哪个方法,以及这些方法为什么要被用到,下面我主要来阐述一下这三个方法的区别 ...

  3. JS 操作 radio input(cc问卷管理)

    1.选中特定的单选按钮 function showDetail(content){ $("input[name^='radio']").removeAttr("check ...

  4. Computer Science Theory for the Information Age-6: 学习理论——VC定理的证明

    VC定理的证明 本文讨论VC理论的证明,其主要内容就是证明VC理论的两个定理,所以内容非常的枯燥,但对于充实一下自己的理论知识也是有帮助的.另外,VC理论属于比较难也比较抽象的知识,所以我总结的这些证 ...

  5. Asp.net封装js的类

    using System; using System.Collections.Generic; using System.Text; using System.Web; using System.We ...

  6. 无需WEB服务器的WEBServices

    本文将介绍如何将Indy控件组与Delphi 6的Web Services (SOAP)支持相结合.关于如何创建Web Services的更多信息,请参阅Nick Hodges的文章,<Web上 ...

  7. HUST 1017 Exact cover (Dancing links)

    1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 6110 次提交 3226 次通过 题目描述 There is an N*M matrix with only 0 ...

  8. [未完成]关于xml文件的解析

    附录一个比较特别的xml文件. MultiNamespaceInlineRequest.xml <?xml version="1.0" encoding="ISO- ...

  9. 【基础数学知识】UVa 11314 - Hardly Hard

    Problem H HARDLY HARD You have been given the task of cutting out a quadrilateral slice of cake out ...

  10. Linux 根文件系统的制作

    一.建立根文件系统目录与文件 1. 创建目录 #mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin sys usr mnt tmp var ...