oss编程

本文档介绍了OSS(开放声音系统)编程,涵盖了音频设备、数字音频处理、MIDI编程、其他设备以及FFMPEG的相关内容。重点讨论了声卡的缓冲区设置、混音器的使用、MIDI消息的解析以及播放音频的流程。通过对/dev/dsp、/dev/audio等设备的操作,实现了音频的录制和播放,并讲解了音频参数如采样率、量化位数、声道数等的设置方法。
摘要由CSDN通过智能技术生成

一、概述

1.声卡

声卡有三个基本功能:一是音乐合成发音功能;二是混音器(Mixer)功能和数字声音效果处理器(DSP)功能;三是模拟声音信号的输入和输出功能。

混音器的作用是将来自音乐合成器、CD-ROM、话筒输入(MIC)等不同来源的声音组合在一起再输出,混音器是每种声音卡都有的。

模拟声音输入输出功能 主要是A/D、D/A转换。

2.MP3格式

MP3其中的VBR,ABR,CBR及相关解释 VBR(Variable Bitrate)动态比特率。也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么

比特率。将一首歌的复 杂部分用高Bitrate编码,简单部分用低Bitrate编码。 

ABR(Average Bitrate)平均比特率,是VBR的一种插值参数。Lame针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。

ABR也 被称为“Safe VBR”,它是在指定的平均Bitrate内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高

流量。举 例来说,当指定用192kbps ABR对一段wav文件进行编码时,Lame会将该文件的85%用192kbps固定编码,然后对剩余15%进行动态优化:复杂部

分用高于192kbps 来编码、简单部分用低于192kbps来编码。与192kbps CBR相比,192kbps ABR在文件大小上相差不多,音质却提高不少。ABR编码在速度

上是VBR编码的2到3倍,在128-256kbps范围内质量要好于CBR。可以做为 VBR和CBR的一种折衷选择。

CBR(Constant Bitrate),常数比特率,指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,但音质却不会有明显的提高。

 对MP3来说Bitrate是最重要的因素,它用来表示每秒钟的音频数据占用了多少个bit(bit per second,简称bps)。这个值越高,音质就越好。

当音乐CD的数据被读到电脑后,他的存储将成为一大难题,我们可以来算一下,44100Hz采样率16bit位率的立体声数据数据一秒钟有多少?

44100Hz * (16 / 8)Byte * 2Channel = 176400字节,也就是0.17M,一分种就是10.5M,一般CD可以存70多分钟的音乐,那么一张CD算下来就是700多M,

对于一般百余G的硬盘空间,这还是比较难以承受的,所以很多年以前有人就提出了有损压缩的办法,采用了类似于快速傅利叶变换的算法,对数据进行处理,可以

把WAVE压缩到很小,一秒钟100-300K,这样就很好的解决了存储的问题,但这是以牺牲了一部分音质为代价的。

二.DSP(数字音频设备)

数字音频系统通过将声波的波型转换成一系列二进制数据,来实现对原始声音的重现,实现这一步骤的设备常被称为模/数转换器(A/D)。A/D转换器

以每秒钟上万次的速率对声波进行采样,每个采样点都记录下了原始模拟声波在某一时刻的状态,通常称之为样本(sample),而每一秒钟所采样的数

目则称为采样频率,通过将一串连续的样本连接起来,就可以在计算机中描述一段声音了。

数字声音效果处理器是对数字化的声音信号进行处理以获得所需要的音响效果(混响、延时、合唱等).

用于表示声卡性能的两个参数是采样率和模拟量转换成数字量之后的数据位数(简称量化位数)。采样率决定了频率响应范围,对声音进行采样的三种标准

以及采样频率分别为:语音效果(11 kHz)、音乐效果(22 kHz)、高保真效果(44.1 kHz),目前声卡的最高采样率为44.1KHz。

量化位数决定了音乐的动态范围,量化位数有8位和16位两种。8位声卡的声音从最低音到最高音只有256个级别,16位声卡有65536个高低音级别。

声道数 :反映音频数字化质量的另一个重要因素,双声道又称为立体声,在硬件中有两条线路,音质和音色都要优于单声道。

 位速说明 Kbps 表示 “每秒千字节数”,因此数值越大表示数据越多。如果您想把制作的 VCD 放在 DVD 播放器上播放,那么视频必须是 1150 Kbps,

音频必须是 224 Kbps。

DSP:数字音频设备(有时也称codec,PCM,ADC/DAC设备),播放或录制数字化的声音。它的指标主要有:采样速率(电话为8K,DVD为96K)、channel

数目(单声道,立体声)、采样分辨率(8-bit,16-bit)。对该设备操作时应注意一次写入数据块的大小,如果数据块过大会引起设备的block操作。 

/dev/dsp与/dev/audio之间的区别在于采样的编码不同,/dev/audio使用μ律编码,/dev/dsp使用8-bit(无符号)线性编码,/dev/dspW使用16-bit(有符号)线

形编码。/dev/audio主要是为了与SunOS兼容,所以尽量不要使用。

在从DSP设备读取数据时,从声卡输入的模拟信号经过A/D转换器变成数字采样后的样本(sample),保存在声卡驱动程序的内核缓冲区中,当应用程序通过read

系统调用从声卡读取数据时,内核缓冲区内容被复制用户缓冲区中。

声卡采样频率是由内核中的驱动程序所决定的。如果应用程序读取数据的速度过慢,以致低于声卡的采样频率,那么多余的数据将会被丢弃;如果读取数据的速度过

快,以致高于声卡的采样频率,那么声卡驱动程序将会阻塞那些请求数据的应用程序,直到新的数据到来为止。

在向DSP设备写入数据时,数字信号会经过D/A转换器变成模拟信号,然后产生出声音。应用程序写入数据的速度同样应该与声卡的采样频率相匹配,否则过慢的话

会产生声音暂停或者停顿的现象,过快的话又会被内核中的声卡驱动程序阻塞,直到硬件有能力处理新的数据为止。声卡通常不会支持非阻塞的I/O操作。

无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(format),默认为8位无符号数据、单声道、8KHz采样率,如果默认值无法达到要求,

可以通过ioctl系统调用来改变它们。

1. 录音

int len = read(audio_fd, audio_buffer, count);

count为录音数据的字节个数(建议为2的指数),但不能超过audio_buffer的大小。从读字节的个数可以精确的测量时间,例如

8kHZ 16-bit stereo的速率为8000*2*2=32000bytes/second,这是知道何时停止录音的唯一方法。

注意:用户始终要读/写一个完整的采样。例如一个16-bit的立体声模式下,每个采样有4个字节,所以应用程序每次必须读/写4的倍数个字节。

还要注意读/写时的字节顺序。

2. 设置参数

设置采样格式

int format;

format = AFMT_S16_LE;

ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) ;

在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:

int mask;

ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &mask) ;

if (mask & AFMT_MPEG) {

/* 本设备支持MPEG采样格式 ... */}

/*设置采样时的量化位数*/

arg = SIZE;

status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);

/* 在继续录音前等待回放结束 */

status = ioctl(fd, SOUND_PCM_SYNC, 0); 

设置声卡工作时的声道(channel)数目

int channels = 0; // 0=mono 1=stereo

int result = ioctl(handle, SNDCTL_DSP_STEREO, &channels);

采样格式和采样频率是在进行音频编程时需要考虑的另一个问题,声卡支持的所有采样格式可以在头文件soundcard.h中找到.

int format = AFMT_U8;

int result = ioctl(handle, SNDCTL_DSP_SETFMT, &format);

声卡采样频率的设置。下面的代码示范了如何设置声卡的采样频率:

int rate = 22050;

int result = ioctl(handle, SNDCTL_DSP_SPEED, &rate);

44100hz

Sample rate of standard Red Book audio CDs.

88000hz

Sample rate of SACD high definition audio discs/downloads. It is rare that your motherboard will support this sample rate.

96000hz

Sample rate of most high definition audio downloads. If your motherboard is an AC'97 motherboard, this is likely to be your highest bitrate.

192000hz

Sample rate of BluRay, and some (very few) high definition downloads. Support for external audio receiver equipment is limited to high end 

audio. Not all motherboards support this. An example of a motherboard chipset that would support this includes HD Audio. 

设置通道数目

int channels = 2; /* 1=mono, 2=stereo */

ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) ;

音频设备通过分频的方法产生需要的采样时钟,因此不可能产生所有的频率。

/* 用于保存数字音频数据的内存缓冲区 */

unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];

Telephone Quality8 KHz or 11.025 KHz

Radio Quality22.05 KHz

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值