– 访问兼容OSS的音频设备 – 多媒体服务(Python教程)(参考资料)
ossaudiodev
– 访问兼容OSS的音频设备
此模块允许您访问OSS(开放式音响系统)音频接口.OSS可用于各种开源和商用Unices,并且是标准音频接口对于Linux和FreeBSD的最新版本.
在版本3.3中更改:此模块中的操作现在提升OSError
其中IOError
被提升了
另见
- Open Sound System程序员指南
- OSS C API的官方文档
该模块定义了OSS devicedriver提供的大量常量;在Linux或FreeBSD上查看<sys/soundcard.h>
以获取列表.
ossaudiodev
定义以下变量和函数:
- exception
ossaudiodev.
OSSAudioError
-
在某些错误上引发此异常。参数是一个描述出错的字符串.
(如果
ossaudiodev
收到来自系统调用的错误,如open()
,write()
或ioctl()
,它会引发OSError
。ossaudiodev
直接检测到的错误导致OSSAudioError
.)(为了向后兼容,异常类也可用作
ossaudiodev.error
。)
ossaudiodev.
open
(mode)ossaudiodev.
open
(device, mode)-
打开音频设备并返回OSS音频设备对象。这个对象支持许多类似文件的方法,例如
read()
,write()
和fileno()
(尽管传统的Unixread / write语义与OSS音频设备之间存在细微的差别)。它还支持许多特定于音频的方法;请参阅下面的完整方法列表.device是要使用的音频设备文件名。如果未指定,则此模块首先在环境变量
AUDIODEV
中查找deviceto用法。如果没有找到,它会回退到/dev/dsp
.mode是
"r"
之一用于只读(记录)访问,"w"
仅转发(回放)访问和"rw"
对彼此而言。由于许多声卡只允许一个进程一次打开记录器或播放器,因此仅为所需的活动打开设备是个好主意。此外,某些声卡是半双工的:它们可以打开读取或写入,但不能同时打开.注意不寻常的调用语法:first参数是可选的,第二个是必需的。这是一个与theolder
linuxaudiodev
模块兼容的历史文物ossaudiodev
supersedes.
ossaudiodev.
openmixer
( [device])-
打开混音器设备并返回OSS混音器设备对象。device是使用的混合设备文件名。如果未指定,则此模块首先查找环境变量
MIXERDEV
以查找要使用的设备。如果没有发现,它会回落到/dev/mixer
.
音频设备对象
在您可以写入或读取音频设备之前,您必须按正确的顺序调用三种方法:
setfmt()
设置输出格式channels()
设置通道数speed()
设置采样率
或者,你可以使用setparameters()
方法设置所有三个音频参数立刻。这样更方便,但在allcases中可能不那么灵活.
open()
返回的音频设备对象定义了以下方法和(只读)属性:
oss_audio_device.
close
()-
明确关闭音频设备。完成写入或读取音频设备后,应明确关闭它。封闭的设备不能再使用了.
oss_audio_device.
fileno
()-
返回与设备关联的文件描述符.
oss_audio_device.
read
(size)-
读size来自音频输入的字节并将它们作为Python字符串返回。与大多数Unix设备驱动程序不同,处于阻塞模式的OSS音频设备(默认)将阻止
read()
直到整个要求的数据量可用.
oss_audio_device.
write
(data)-
写一个字节对象 data到音频设备并返回写入的字节数。如果音频设备处于阻塞模式(默认),则始终写入整个数据(同样,这与Unix设备语义不同)。如果设备处于非阻塞模式,则可能无法写入某些数据 – 请参阅
writeall()
.版本3.5更改:可写字节对象现已被接受.
oss_audio_device.
writeall
(data)-
写一个类似字节的对象 data到音频设备:等到音频设备能够接受数据,写入尽可能多的数据,并重复直到data已完全写入。如果设备处于阻塞模式(默认),则效果与
write()
相同;writeall()
仅在非阻塞模式下有用。Hasno返回值,因为写入的数据量总是等于提供的数据量.在版本3.5中更改:可写字节对象现在被接受了
更改版本3.2:音频设备对象也支持上下文管理协议,即它们可以用在with
语句中
以下方法各自映射到一个ioctl()
系统调用。对应性是显而易见的:例如,setfmt()
对应于SNDCTL_DSP_SETFMT
ioctl和sync()
到SNDCTL_DSP_SYNC
(在查阅OSS文档时这可能很有用)。如果底层ioctl()
失败,他们都会举起OSError
.
oss_audio_device.
nonblock
()-
将设备置于非阻塞模式。一旦进入非阻塞模式,现在可以将其恢复为阻塞模式.
oss_audio_device.
getfmts
()-
返回声卡支持的音频输出格式的位掩码。OSS支持的一些格式是:
格式 描述 AFMT_MU_LAW
对数编码(由Sun .au
文件和/dev/audio
使用)AFMT_A_LAW
对数编码 AFMT_IMA_ADPCM
由互动多媒体协会定义的4:1压缩格式 AFMT_U8
无符号,8位音频 AFMT_S16_LE
有符号的16位音频,little-endian byteorder(由英特尔处理器使用) AFMT_S16_BE
有符号的16位音频,大端字节顺序(由68k,PowerPC,Sparc使用) AFMT_S8
有符号,8位音频 AFMT_U16_LE
无符号,16位小端音频 AFMT_U16_BE
无符号,16位大端音频 查阅OSS文档以获取完整的音频格式列表,以及请注意,大多数设备仅支持这些格式的子集。有些旧设备只支持
AFMT_U8
;今天最常用的格式是AFMT_S16_LE
.
oss_audio_device.
setfmt
(format)-
尝试将当前音频格式设置为format – 见
getfmts()
对于alist。返回设备设置的音频格式,可能不是格式。也可以用来返回当前的音频格式 – 通过传递AFMT_QUERY
.
oss_audio_device.
channels
(nchannels)-
设置输出通道数为nchannels。值1表示单声道声音,2表示立体声。某些设备可能有两个以上的通道,而某些高端设备可能不支持单声道。返回设备设置为的通道数.
oss_audio_device.
speed
(samplerate)-
尝试将音频采样率设置为samplerate每秒采样数。返回实际设定的费率。大多数声音设备不支持任意采样率。常见的费率是:
评价 说明 8000 /dev/audio
11025 默认速率录音 22050 44100 CD音质(16位/样本和2个通道) 96000 DVD质量的音频(24位/样本)
oss_audio_device.
sync
()-
等到声音设备播放其缓冲区中的每个字节。(当设备关闭时会发生这种情况。)OSS文档建议关闭并重新打开设备而不是使用
sync()
.
oss_audio_device.
reset
()-
立即停止播放或录制并返回设备到可以接受命令的状态。OSS文档建议在调用
reset()
.
oss_audio_device.
post
()-
后关闭并重新打开设备告诉驱动程序输出中可能有暂停,使其可用于设备更智能地处理暂停。你可以在播放现场音效后,在等待用户输入之前,或在磁盘I / O之前使用它.
下面的便捷方法结合了几个ioctl,或者一个ioctl和一些简单的计算.
oss_audio_device.
setparameters
(format, nchannels, samplerate [, strict=False] )-
在一次方法调用中设置关键音频采样参数 – 采样格式,通道数和采样率。format, nchannels和samplerate应按
setfmt()
,channels()
和speed()
方法。如果strict为真,setparameters()
检查每个参数是否实际上达到了所要求的值,并引发OSSAudioError
如果不。返回一个元组(format, nchannels,samplerate)表示设备驱动程序实际设置的参数值(即与的返回值相同)setfmt()
,channels()
,和speed()
).例如,
(fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)
相当于
fmt = dsp.setfmt(fmt)channels = dsp.channels(channels)rate = dsp.rate(rate)
oss_audio_device.
bufsize
()-
返回硬件缓冲区的大小,在样本中
oss_audio_device.
obufcount
()-
返回尚未播放的硬件缓冲区中的样本数.
oss_audio_device.
obuffree
()-
返回可以排队到硬件缓冲区中的样本数量,无需阻塞即可播放.
音频设备对象也支持几个只读属性:
oss_audio_device.
closed
-
指示设备是否已关闭的布尔值.
oss_audio_device.
name
-
包含设备文件名称的字符.
oss_audio_device.
mode
-
文件的I / O模式,
"r"
,"rw"
或"w"
.
混音器设备对象
混音器对象提供两种类似文件的方法:
oss_mixer_device.
fileno
()-
返回打开的混音器设备文件的文件句柄号.
更改版本3.2:混音器对象也支持上下文管理协议.
其余的方法特定于音频混合:
oss_mixer_device.
controls
()-
此方法返回一个位掩码,指定可用的混音器控件(“Control”是一个特定的可混合“通道”, 如
SOUND_MIXER_PCM
要么SOUND_MIXER_SYNTH
)。此位掩码表示所有可用混音器控件的子集 –SOUND_MIXER_*
在模块级别定义的常量。例如,要确定当前混音器对象是否支持PCM混音器,请使用以下Python代码:mixer=ossaudiodev.openmixer()if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): # PCM is supported ... code ...
对于大多数用途,
SOUND_MIXER_VOLUME
(主音量)和SOUND_MIXER_PCM
控件应该足够了 – 但是在选择混音器控件时,使用混音器的代码应该是灵活的。例如,在GravisUltrasound上,SOUND_MIXER_VOLUME
不存在.
oss_mixer_device.
stereocontrols
()-
返回指示立体声混音器控件的位掩码。如果设置了一个位,则相应的控制是立体声;如果没有设置,控制器可以是单音或不支持混音器(与结合使用)
controls()
确定哪个).请参阅
controls()
函数用于从bitmask获取数据的例子.
oss_mixer_device.
get
(control)-
返回给定混音器控件的音量。返回的卷是一个2元组
(left_volume,right_volume)
。卷被指定为从0(静音)到100(完整音量)的数字。如果控制是单声道的,那么仍然会返回2元组,但两个音量都是相同的.
oss_mixer_device.
set
(control, (left, right))-
设置给定混音器控件的音量
(left,right)
.left
和right
必须是整数,介于0(静音)和100(完整音量)之间。Onsuccess,新卷以2元组的形式返回。请注意,这可能与指定的音量完全不同,因为某些声卡的混音器的分辨率有限.
oss_mixer_device.
get_recsrc
()-
这个方法返回一个位掩码,表明当前正在使用哪个控件作为录音源.
oss_mixer_device.
set_recsrc
(bitmask)-
调用此函数指定录制源。如果成功,返回指示新记录源(或多个源)的位掩码;如果指定了无效的来源,则会引发
OSError
。将当前录音源设置为麦克风输入:mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)