背景:为什么用到这个类库呢?公司要一个要播放音频文件(.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. Flex4之元数据标签使用

    Flex 元数据标签 1.[ArrayElementType] 使用ArrayElementType元数据标签可以让你定义数组元素的数据类型. 程序代码: [ArrayElementType(&quo ...

  2. debian7编译内核

    第一个步骤“配置内核”. 在这里,我比较建议在发行版默认的config的基础上再进行配置,这样 配置出的内核和发行版本身才会有更好的相容性.比如可以在运行“make menuconfig”之前执行命令 ...

  3. Old Calculator

    描述 szhhck have an old calculator bought 5 years ago.he find the old machine can just calculate expre ...

  4. Centos6.4安装Mono和MonoDevelop

    Mono官方网站:http://www.mono-project.com MonoDevelop官方网站:http://monodevelop.com/ 注:整个安装过程最好在同一个终端下完成!   ...

  5. [改善Java代码]列表相等只需关系元素数据

    来看一个判断列表相等的例子,看代码: import java.util.ArrayList; import java.util.Vector; public class Client { public ...

  6. 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动

    在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...

  7. Android中定义接口的方法

    1.接口方法用于回调(这里定义接口是为了使用其接口方法): public interface ICallback { public void func(); } public class Caller ...

  8. U-boot新手入门

    U-boot新手入门 一.编译U-boot 二.U-boot命令详解 1.帮助命令 # help autoscr -run script from memory base -print or set ...

  9. Jersey(1.19.1) - Life-cycle of Root Resource Classes

    By default the life-cycle of root resource classes is per-request, namely that a new instance of a r ...

  10. HttpClient(4.3.5) - Exception Handling

    HttpClient can throw two types of exceptions: java.io.IOException in case of an I/O failure such as ...