背景:为什么用到这个类库呢?公司要一个要播放音频文件(.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. Unable to automatically debug "XXXXX“

    I solved this issue by going to C:\Program Files\Microsoft VisualStudio10.0\Common7\IDE then running ...

  2. currentTarget 与 Target 的区别

    在一般情况下,target与currentTarget指向的是同一个对象.一般情况是指我们只对某一个独立的mc添加侦听器.如下: var mc:Sprite=new Sprite();addChild ...

  3. Java中的DeskTop类

        在Jdk1.6以后新增加了一个类--DeskTop,在JDK中它的解释是这样的: The Desktop class allows a Java application to launch a ...

  4. 强烈推荐240多个jQuery插件提供下载

    jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及 的 ...

  5. 关于 VS2012 创建 MVC4 Empty 项目的一个小问题

    今天下午发现一个新建的项目工作异常,主要表现为应该返回JSON的Action没有返回JSON字符串,而是返回了JsonResult的对象名,即字符串“System.Web.Mvc.JsonResult ...

  6. AVL树的插入操作(旋转)图解

    =================================================================== AVL树的概念       在说AVL树的概念之前,我们需要清楚 ...

  7. 给jdk写注释系列之jdk1.6容器(9)-Strategy设计模式之Comparable&Comparator接口

    前面我们说TreeMap和TreeSet都是有顺序的集合,而顺序的维持是要靠一个比较器Comparator或者map的key实现Comparable接口.      既然说到排序,首先我们不用去关心什 ...

  8. shareplex的安装&&起停服务(添加新用户)

    一.主机环境   主从类型 系统版本 数据库版本 主机地址 主机名 源数据库 Centos6.4 X86_64 11.2.0.4.0 192.168.3.230 dbshareplex 目的数据库 C ...

  9. CF Watto and Mechanism (字典树+深搜)

    Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  10. [改善Java代码]枚举和注解结合使用威力更大

    注解的写法和接口很类似,都采用了关键字interface,而且都不能有实现代码,常量定义默认都是pulbic static final类型的. 他们的主要不同点是:注解在interface前加上@字符 ...