背景:为什么用到这个类库呢?公司要一个要播放音频文件(.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. Line Search and Quasi-Newton Methods

    Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...

  2. 升级时出现:请先升级 UCenter 到 1.6.0 以上版本。

    有的站点UCenter升级完成后仍然提示请先升级 UCenter 到 1.6.0 以上版本的现象,下面分享下UCenter版本号不正确的原因和处理办法,可能有以下的几个文件和处理办法: 一.UCent ...

  3. PHP如何抓取https内容?记录一下。

    PHP里做一般的获取内容时,用自带的file_get_contents()函数基本就足够了.当然,这个函数只能抓一些简单的数据,如果是遇到需要登录的页面,就不行了,而且效率及稳定性也不是很强.所以要是 ...

  4. selenium python 环境搭建(64位 windows)

    之前写了同样的文章,可是后来自己按照给文章再次搭建环境当搭建环境成功后却发现还是无法用.使用from selenium import webdriver,在run的时候却出现ImportError: ...

  5. java.lang.IllegalStateException

    java.lang.IllegalStateExceptionorg.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFac ...

  6. 慕课网,我的yii2学习笔记(基础篇)

    一.关于PHP知识点 1.命名空间:存放类文件的空间,可以随便定义,建议与类文件目录一致,方便管理. 注:(1).如果类没有设置命名空间,默认为顶级命名空间,在程序中可以用一下方式实例化. $mode ...

  7. [转]T4模版引擎之生成数据库实体类

    本文转自:http://www.cnblogs.com/lzrabbit/archive/2012/07/18/2597953.html 在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实 ...

  8. 【转载】Android推送方案分析(MQTT/XMPP/GCM)

    http://m.oschina.net/blog/82059 本文主旨在于,对目前Android平台上最主流的几种消息推送方案进行分析和对比,比较客观地反映出这些推送方案的优缺点,帮助大家选择最合适 ...

  9. Unity3d导入工程出现错误“Creating unique file”的解决方法

    Unity3d导入工程出现错误“Creating unique file:creating file Temp/tempFile failed.Please ensure there is enoug ...

  10. Unity出现 error building player exception android (invocation failed)

    今天在编译Android的时候出现这个错误 error building player exception android (invocation failed) 百度谷歌之后,看到xuanyuson ...