2003 年 3 月 03 日
OSS(Open Sound System)是 unix 平台上一个统一的音频接口, 即只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。
....................................................................
同时,很多的Unix工作站中,只能提供录音与放音的功能。有了OSS后,给这些工作站带来了MIDI功能,加上音频流、语音识别/生 成、计算机电话(CT)、JAVA以及其它的多媒体技术,在Unix工作站中,同样可以享受到同Windows、Macintosh环境一样的音频世界。 另外,OSS还提供了与视频和动画播放同步的音频能力,这对在Unix中实现动画、游戏提供了帮助。
本文首先解释在音频编程时经常遇到的名词、设备文件的含义,然后分别在录音、播放、Mixer方面对OSS接口的使用方法进行介绍。由于OSS API十分丰富,因此在本文中只介绍那些最为常用的接口。对于OSS API的一个完整描述,可以参考[1]。
数字音频设备(有时也称codec,PCM,DSP,ADC/DAC设备):播放或录制数字化的声音。它的指标主要有:采样速率(电话为8K,DVD为96K)、channel数目(单声道,立体声)、采样分辨率(8-bit,16-bit)。
mixer(混频器):用来控制多个输入、输出的音量,也控制输入(microphone,line-in,CD)之间的切换。
synthesizer(合成器):通过一些预先定义好的波形来合成声音,有时用在游戏中声音效果的产生。
MIDI 接口:MIDI接口是为了连接舞台上的synthesizer、键盘、道具、灯光控制器的一种串行接口。
在Unix系统中,所有的设备都被统一成文件,通过对文件的访问方式(首先open,然后read/write,同时可以使用ioctl读取/设置参数,最后close)来访问设备。在OSS中,主要有以下的几种设备文件:
这些设备文件的设备编号见[1]。
OSS为音频编程提供三种设备,分别是/dev/dsp,/dev/dspW和/dev/audio,前面已经提到了它们之间的区别。
用户可以直接使用Unix的命令来放音和录音,命令cat /dev/dsp >xyz可用来录音,录音的结果放在xyz文件中;命令cat xyz >/dev/dsp播放声音文件xyz。
如果通过编程的方式来使用这些设备,那么Unix平台通过文件系统提供了统一的访问接口。程序员可以通过文件的操作函数直接控制这些设备, 这些操作函数包括:open、close、read、write、ioctl等。下面我们就分别讨论打开音频设备、放音、录音和参数调整。
1) 头文件定义
/*
* Standard includes
*/
#include <ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/soundcard.h>
/*
* Mandatory variables.
*/
#define BUF_SIZE 4096
int audio_fd;
unsigned char audio_buffer[BUF_SIZE];
|
2) 打开设备
if ((audio_fd = open(DEVICE_NAME, open_mode, 0)) == -1) {
/* Open of device failed */
perror(DEVICE_NAME);
exit(1);
}
|
open_mode有三种选择:O_RDONLY,O_WRONLY和O_RDWR,分别表示只读、只写和读写。OSS建议尽量使用只读或只写,只有在全双工的情况下(即录音和放音同时)才使用读写模式。
int len;
if ((len = read(audio_fd, audio_buffer, count)) == -1) {
perror("audio read");
exit(1);
}
|
count为录音数据的字节个数(建议为2的指数),但不能超过audio_buffer的大小。从读字节的个数可以精确的测量时间,例如8kHZ 16-bit stereo的速率为8000*2*2=32000bytes/second,这是知道何时停止录音的唯一方法。
放音实际上和录音很类似,只不过把read改成write即可,相应的audio_buffer中为音频数据,count为数据的长度。
注意,用户始终要读/写一个完整的采样。例如一个16-bit的立体声模式下,每个采样有4个字节,所以应用程序每次必须读/写4的倍数个字节。
另外,由于OSS是一个跨平台的音频接口,所以用户在编程的时候,要考虑到可移植性的问题,其中一个重要的方面是读/写时的字节顺序。
-
设置采样格式
int format;
format = AFMT_S16_LE;
if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {
/* fatal error */
perror("SNDCTL_DSP_SETFMT");
exit(1);
}
if (format != AFMT_S16_LE) {
/* 本设备不支持选择的采样格式. */
}
在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:
int mask;
if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &mask) == -1) {
/* Handle fatal error ... */
}
if (mask & AFMT_MPEG) {
/* 本设备支持MPEG采样格式 ... */}
|
-
设置通道数目
int channels = 2; /* 1=mono, 2=stereo */
if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) {
/* Fatal error */
perror("SNDCTL_DSP_CHANNELS");
exit(1);
}
if (channels != 2)
{/* 本设备不支持立体声模式 ... */}
|
-
设置采样速率
int speed = 11025;
if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1) {
/* Fatal error */
perror("SNDCTL_DSP_SPEED");
exit(Error code);
}
if ( /* 返回的速率(即硬件支持的速率)与需要的速率差别很大... */ ) {
/* 本设备不支持需要的速率... */
}
|
音频设备通过分频的方法产生需要的采样时钟,因此不可能产生所有的频率。驱动程序会计算出最接近要求的频率来,用户程序要检查返回的速率值,如果误差较小,可以忽略,但误差不能太大。
对Mixer的控制,包括调节音量(volume)、选择录音音源(microphone,line-in)、查询mixer的功能和状 态,主要是通过Mixer设备/dev/mixer的ioctl接口。相应的,ioctl接口提供的功能也分为三类:调节音量、查询mixer的能力、选 择mixer的录音通道。下面就分别介绍使用的方法:
下面的mixer_fd是对mixer设备执行open操作返回的文件描述符。
-
调节音量
应用程序通过ioctl的SOUND_MIXER_READ和SOUND_MIXER_WIRTE功能号来读取/设置音量。在OSS中,音量的大小范围在0-100之间。使用方法如下:
int vol;
if (ioctl(mixer_fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol) == -1) {
/* 访问了没有定义的mixer通道... */
|
SOUND_MIXER_MIC是通道参数,表示读microphone通道的音量,结果放置在vol中。如果通道是立体声,那么vol的最低有效 字节为左声道的音量值,接着的字节为右声道的音量值,另外的两个字节不用。如果通道是单声道,vol中左声道与右声道具有相同的值。
-
查询mixer的能力
int mask;
if (ioctl(mixer_fd, SOUND_MIXER_READ_xxxx, &mask) == -1) {
/* Mixer 的没有此能力... */
}
|
SOUND_MIXER_READ_xxxx 中的xxxx代表具体要查询的内容,比如检查可用的mixer通道用SOUND_MIXER_READ_DEVMASK;检查可用的录音设备,用 SOUND_MIXER_READ_RECMASK;检查单声道/立体声,用SOUND_MIXER_READ_STEREODEVS;检查mixer的 一般能力,用SOUND_MIXER_READ_CAPS等等。所有通道的查询的结果都放在mask中,所以要区分出特定通道的状况,使用 mask& (1 << channel_no)。
-
选择mixer的录音通道
首先可以通过SOUND_MIXER_READ_RECMASK检查可用的录音通道,然后通过SOUND_MIXER_WRITE_RECSRC选择录音通道。可以随时通过SOUND_MIXER_READ_RECSRC查询当前声卡中已经被选择的录音通道。
OSS建议把mixer的用户控制功能单独出来形成一个通用的程序。但前提是,在使用mixer之前,首先通过API的查询功能检查声卡的能力。在linux中,就有一个专门的mixer程序--aumix。
|
相关推荐
赠送jar包:oss-spring-boot-starter-1.0.3.jar; 赠送原API文档:oss-spring-boot-starter-1.0.3-javadoc.jar; 赠送源代码:oss-spring-boot-starter-1.0.3-sources.jar; 赠送Maven依赖信息文件:oss-spring-boot...
赠送jar包:oss-spring-boot-starter-1.0.3.jar 赠送原API文档:oss-spring-boot-starter-1.0.3-javadoc.jar 赠送源代码:oss-spring-boot-starter-1.0.3-sources.jar 包含翻译后的API文档:oss-spring-boot-...
阿里云青岛节点oss服务报错解决方式 The bucket you are attempting to access must be addressed using the specified endpoint.... 原内网地址oss-internal.aliyuncs.com 默认指向杭州节点内网地址
赠送jar包:aliyun-sdk-oss-2.5.0.jar; 赠送原API文档:aliyun-sdk-oss-2.5.0-javadoc.jar; 赠送源代码:aliyun-sdk-oss-2.5.0-sources.jar; 包含翻译后的API文档:aliyun-sdk-oss-2.5.0-javadoc-API文档-中文...
oss-browser-win32-x64
aliyun-sdk-oss-2.8.3.jar
赠送jar包:aliyun-sdk-oss-2.8.2.jar; 赠送原API文档:aliyun-sdk-oss-2.8.2-javadoc.jar; 赠送源代码:aliyun-sdk-oss-2.8.2-sources.jar; 赠送Maven依赖信息文件:aliyun-sdk-oss-2.8.2.pom; 包含翻译后的API...
赠送jar包:aliyun-sdk-oss-3.11.2.jar; 赠送原API文档:aliyun-sdk-oss-3.11.2-javadoc.jar; 赠送源代码:aliyun-sdk-oss-3.11.2-sources.jar; 赠送Maven依赖信息文件:aliyun-sdk-oss-3.11.2.pom; 包含翻译后...
赠送jar包:aliyun-sdk-oss-2.8.2.jar; 赠送原API文档:aliyun-sdk-oss-2.8.2-javadoc.jar; 赠送源代码:aliyun-sdk-oss-2.8.2-sources.jar; 赠送Maven依赖信息文件:aliyun-sdk-oss-2.8.2.pom; 包含翻译后的API...
aliyun-sdk-oss-3.1.0.jar
elasticsearch-repository-oss-6.7.0, elasticsearch-repository-oss-6.7.2从oss恢复es快照到集群插件。
mysql-workbench-oss-5.2mysql-workbench-oss-5.2mysql-workbench-oss-5.2
aliyun-sdk-oss-3.10.2.jar,免费下载
Laravel开发-ali-oss-storage 用于Laravel 5的Aliyun OSS文件系统存储
小程序配置阿里云OSS下载文件,在请求头里配置生成强制下载链接,所需文件,因为在阿里云oss平台只能设置查看/下载 ,一种方式,对于某些业务需求不能够满足,所以此思路就是--在设置时把文件设置成公共读,然后拿到...
aliyun-oss-upload-stream, 一个 node.js 模块,用于通过多部分上传API将数据流到 Aliyun 操作系统 aliyun-oss-upload-stream 官方指定Nodejs模块~可以上传大文件,根据上传数据方式不同而不同,将对象方式文件最大...
阿里云OSS-sdk,大小536KB 微信小程序纯前端从阿里云OSS下载,可直接引用 文章地址:https://blog.csdn.net/qq_44695727/article/details/132154404
赠送jar包:aliyun-sdk-oss-2.5.0.jar; 赠送原API文档:aliyun-sdk-oss-2.5.0-javadoc.jar; 赠送源代码:aliyun-sdk-oss-2.5.0-sources.jar; 包含翻译后的API文档:aliyun-sdk-oss-2.5.0-javadoc-API文档-中文...
阿里云文件上传依赖最新版本aliyun-sdk-oss-3.11.2.jar