Alsa是Linux高级音频接口。面对众多的音频设备,Alsa为Linux音频开发人员提供了一套标准的访问机制,使得音频开发变得十分容易。不信?下面我们就利用它编写一个简单的录音/播音程序,不过这需要你有一定的计算机语言基础。
一个典型的音频程序应该具有以下结构:  打开音频设备  为设备设置读写参数  向音频设备读/写音频数据  关闭设备,Alsa库为我们实现这些操作提供了丰富的接口。  
首先让我们封装一个打开音频设备的函数 
<pre name="code" class="cpp">snd_pcm_t *pcm_handle;
bool device_open(int mode)
{
<span style="white-space:pre"> </span>if (snd_pcm_open (&pcm_handle, “default” , mode , 0) < 0)
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>return true; }
snd_pcm_open是Alsa库提供的打开设备调用函数,这里我们指定打开缺省的音频设备,并根据参数mode将设备置为录音或是播放状态,如果设备打开成功,pcm_handle便指向该设备句柄,我们用全局变量保存起来,方便以后使用。
第二步是设置参数,参数设置不当将会导致音频设备无法正常工作。在设置参数前,我们需要了解一下各个参数的含义以及一些基本概念。
样本长度(sample): 样本是记录音频数据最基本的单位,常见的有8位和16位。  通道数(channel):该 参数为1表示单声道,2则是立体声。
桢(frame):桢记录了一个声音单元,其长度为样本长度与通道数的乘积。  采样率(rate):每秒钟采样次 数,该次数是针对桢而言。
周期(period):音频设备一次处理所需要的桢数,对于音频设备的数据访问以及音频数据的存储,都是以此 为单位。
交错模式(interleaved):是一种音频数据的记录方式,在交错模式下,数据以连续桢的形式存放,即首先记 录完桢1的左声道样本和右声道样本(假设为立体声格式),再开始桢2的记录。 而在非交错模式下,首先记录的是一个周期内所有桢的左声道样本,再记录右声 道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错 模式就可以了。
明白了各参数含义及关系后,我们开始设置参数: 
</pre><pre name="code" class="cpp">int bit_per_sample; //样本长度(bit)
int period_size; //周期长度(桢数) <span style="font-family: 'Microsoft YaHei', 'Helvetica Neue', SimSun; text-indent: 2em;"> int chunk_byte; //周期长度(字节数)</span>
<span style="text-indent: 2em; font-family: 'Microsoft YaHei', 'Helvetica Neue', SimSun;">snd_pcm_hw_params_t *params; //定义参数变量 </span>
 <span style="text-indent: 2em; font-family: 'Microsoft YaHei', 'Helvetica Neue', SimSun;">bool device_setparams(){  snd_pcm_hw_params_t *hw_params;</span>
</pre><pre name="code" class="cpp">snd_pcm_hw_params_malloc (&hw_params); //为参数变量分配空间  
snd_pcm_hw_params_malloc (¶ms);
snd_pcm_hw_params_any ( pcm_handle, hw_params ); //参数初始化  
snd_pcm_hw_params_set_access ( pcm_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); //设置为交错模式
snd_pcm_hw_params_set_format( pcm_handle, hw_params, SND_FORMAT_S16_LE); //使用用16位样本
snd_pcm_hw_params_set_rate_near( pcm_handle, hw_params, 44100, 0); //设置采样率为44.1KHz
snd_pcm_hw_params_set_channels( pcm_handle, hw_params, 2); //设置为立体声  
snd_pcm_hw_params_get_period_size( hw_params, &period_size); //获取周期长度  
bit_per_sample = snd_pcm_hw_format_physical_width( hw_params.format ); //获取样本长度
chunk_byte = period_size * bit_per_sample * hw_params.channels / 8; //计算周期长度(字节数(bytes) = 每周期的桢数 * 样本长度(bit) * 通道数 / 8 )
snd_pcm_hw_params( pcm_handle, hw_params); //设置参数  params = hw_params; //保存参数,方便以后使用
snd_pcm_hw_params_free( hw_params); //释放参数变量空间  
return true;  
}
例程实例见:http://blog.csdn.net/evilcode/article/details/7594328

转载:http://blog.csdn.net/sepnic/article/details/6140824

原作者blog地址:http://blog.csdn.net/sepnic/

Alsa是Linux高级音频接口(百度文库无下载券抄来的)相关推荐

  1. python爬虫破解百度文库_用Python爬取百度文库0下载券的免费文档详细步骤,附可执行软件...

    [Python] 纯文本查看 复制代码from urllib import parse import requests import webbrowser from pyquery import Py ...

  2. python可以下载百度文库_百度文库随便下载,解除限制

    阅读须知:文章介绍的软件下载地址载文末,需要复制链接到浏览器打开 今天有小伙伴在群里问有没有百度文库的下载工具,其实之前推荐过,但目前有新的工具出现了,而且更加好用,所以给大家更新一下 百度文档0.9 ...

  3. js input复选框选中父级同时子级也选中_突破百度JS反爬获取百度文库数据下载...

    毕业,是一首离别的歌 前言 炎炎夏季,又快到了我们该说毕业的时候.都说分开是为了更好的相聚,让我们彼此珍惜! 在这个炎热的空档期,对于技术渴望的宅男腐女们我们该做点什么呢?那最好的方式就是用编程来填补 ...

  4. 在Linux环境下通过百度网盘下载并安装matlab2017a

    前言 百度网盘下载matlab2017a安装包 方式1:安装百度网盘的python程序bypy 方式2:直接在浏览器下载 安装matlab 备注 参考链接 前言 最近参加一个比赛,需要在官方公布的li ...

  5. 微信公众号-音频接口(上传、下载、辨音)

    原文链接:https://www.cnblogs.com/liruoruo/p/10276109.html 音频相关接口,其中需要注意的是:上传语音有效期3天,可用微信多媒体接口下载语音到自己的服务器 ...

  6. 百度文库不能下载解决方案

    大家经常会上百度搜索资料,结果发现在百度文库那边可以找到,兴奋了半天却发现下载时是需要文库财富值的.针对这种情况,今天我给大家带来一个破解百度文库下载的方法,其实非常简单,而且不用下载任何软件. 首先 ...

  7. linux程序设计百度网盘,linux系统编程视频 百度网盘下载

    本帖最后由 雇佣兵333 于 2015-5-19 16:15 编辑 c教程目录: Linux开发快速入门培训 gcc快速入门 Makefile快速入门 GDB快速入门 Linux系统编程之文件篇 01 ...

  8. Android初级到高级视频教程全套 百度网盘下载

    百度网盘视频资源下载 https://pan.baidu.com/s/1MVYKj4L8-1nU7Er3z5UGRA https://pan.baidu.com/s/1ewu5bDpuggEu9y_K ...

  9. 百度文库随便下载,不借用任何插件

    话不多说,下面开始正题 我们都知道每个文档都对应了一个网址 http删除s://wenku点baidu点com/view/e336fe98b9f67c1cfad6195f312b3169a551ea1 ...

  10. linux shell 网盘,linux shell脚本编写百度网盘下载无法运行

    但是,在进行类型转换时,有时候仅仅依靠VB提供的函数是不能达到自己的目的的org.mybatis.spring.bootOptionExplicit PrivateDeclareFunctionOSG ...

最新文章

  1. 领导者有3个要求,你做到了吗?
  2. linux命令行之find详解
  3. 【PAT (Advanced Level) Practice】1050 String Subtraction (20 分)
  4. 基于机器学习的捡球机器人设计与实现(探索)第6篇——另一种高效追踪网球思路
  5. 高德最佳实践:Serverless 规模化落地有哪些价值?
  6. linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
  7. 第二冲刺阶段个人博客7
  8. Diccuz!NT的dll版本号控制技巧
  9. 形容女人的词语大全(坏与好)
  10. whitepages 被调查_槐荫区美里湖办事处残联开展2020年残疾人精准服务需求调查工作...
  11. Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
  12. JavaScript高级程序设计学习笔记(二)
  13. 4.计蒜客ACM题库.A1947 An Olympian Math Problem
  14. 如何进行反欺诈风控模型冷启动
  15. SecureCRT软件的使用
  16. SEO网站内容优化的6点干货分享分享-飞鱼SEO
  17. [新华三-H3C]ppp实验
  18. Android2.1源码目录结构
  19. 今日头条最新_signature
  20. 根据身份证号码(15位或者18位)自动获取出生日期及性别

热门文章

  1. Windows登录FTP服务器方法
  2. qtdesigner页面布局
  3. kawamura+maya+picture_[转载]Softimage+Maya(krakatoaMY)+Nuke制作卷浪思路整理
  4. html展开阅读全文代码,一个简单的html点击展开/关闭代码
  5. php报修小程序,微信小程序报修管理系统
  6. 二、SSM即Spring、SpringMVC、Mybatis整合
  7. esp8266使用BME280实时上传温湿度气压
  8. sap销售发货的流程_SAP系统销售流程
  9. 电容的串联和并联的性质
  10. 2022R1快开门式压力容器操作操作证考试题库及在线模拟考试