Alsa 音频编程小结(一)

本文主要记录我在完成实现基本录音与播放的过程中遇到的问题。
首先,介绍完成程序,我参考过的博文:
http://blog.csdn.net/u013494117/article/details/52269463
http://blog.csdn.net/keepingstudying/article/details/50674284

一、了解一下各个参数的含义以及一些基本概念
样本长度(sample):样本是记录音频数据最基本的单位,计算机对每个通道采样量化时数字比特位数,常见的有8位和16位。

通道数(channel):该参数为1表示单声道,2则是立体声。

帧(frame):帧记录了一个声音单元,其长度为样本长度与通道数的乘积,一段音频数据就是由苦干帧组成的。

采样率(rate):每秒钟采样次数,该次数是针对帧而言,常用的采样率如8KHz的人声, 44.1KHz的mp3音乐, 96Khz的蓝光音频。

周期(period):音频设备一次处理所需要的桢数,对于音频设备的数据访问以及音频数据的存储,都是以此为单位。

交错模式(interleaved):是一种音频数据的记录方式 在交错模式下,数据以连续桢的形式存放,即首先记录完桢1的左声道样本和右声道样本(假设为立体声格式),再开始桢2的记录。 而在非交错模式下,首先记录的是一个周期内所有桢的左声道样本,再记录右声道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错模式就可以了。

period(周期): 硬件中中断间的间隔时间。它表示输入延时。

比特率(Bits Per Second):比特率表示每秒的比特数,比特率=采样率×通道数×样本长度
二、ALSA介绍
1、设备命名

  API库使用逻辑设备名而不是设备文件。设备名字可以是真实的硬件名字也可以是插件名字。硬件名字使用hw:i,j这样的格式。其中i是卡号,j是这块声卡上的设备号。

  第一个声音设备是hw:0,0.这个别名默认引用第一块声音设备并且在本文示例中一真会被用到。

  插件使用另外的唯一名字,比如 plughw:,表示一个插件,这个插件不提供对硬件设备的访问,而是提供像采样率转换这样的软件特性,硬件本身并不支持这样的特性。
  我用的是主机的本地声卡,所以声卡设备要使用“default”或“hw:0,0”。否则在设置参数的时候
  

 rc = snd_pcm_hw_params(handle, params);
  if (rc < 0) {
    fprintf(stderr,
            "unable to set hw parameters: %s\n",
            snd_strerror(rc));
    exit(1);
  }

会出现invalid arguments 。无效参数。

在前面提到的参考博文中,录音和播放程序里面会出现下面的语句。

 /* We want to loop for 5 seconds */
  snd_pcm_hw_params_get_period_time(params,&val, &dir);
  /* 5 seconds in microseconds divided by
   * period time */
  loops = 5000000 / val;

这里的val变量和前面程序里用到的采样率参数val=44100是同一个变量。但是这里我们要的到的是周期,执行完上面一条语句后,val的值不在是采样率的值了。

猜你喜欢

转载自blog.csdn.net/meibenxiang/article/details/52291232