使用ossaudiodev播放音频

原文地址:http://blog.52sox.com/use-oss…

在Python的标准库的多媒体设备中有1个关于兼容oss音频设备的ossaudiodev模块,这个模块是在Python2.3的时候引入的。通过这个模块允许你访问OSS(Open Sound System)音频接口。
在Linux中,音频系统主要有2个,分别为OSS和ALSA,其中后者已经取代了OSS的位置作为默认的音频系统。
下面我们在debian的wheezy版本下来查看下这个模块的使用,相比之前已经使用过了pyaudio这样的模块,会觉得对音频的操作是蛮简单的。
在此之前,我们需要安装oss包,当前最新的版本为4,我们可以通过下载deb或直接通过debian的包管理工具进行安装:

cat@debian:~$ sudo aptitude install oss4-base oss4-source oss4-dev

这里我们安装了oss的基础包、源码包以及开发包。安装完成后,我们需要重启机器以便设备能被识别出来。
我们导入该模块:

>>> import ossaudiodev

接下来,我们通过该模块的open方法打开1个音频设备,这个方法返回1个OSS音频设备对象。它支持类文件方法,比如read,write和fileno。
其中open方法有2种操作的方式:

ossaudiodev.open(mode)
ossaudiodev.open(device, mode)

在这里,device是使用的音频设备的名称。如果没有指定,这个模块将查看环境变量AUDIODEV来选择使用的设备。如果没有找到,则将回滚到/dev/dsp,对于Sun系统则为/dev/audio
而选择的模式mode,可以为只读(录音)、只写(回放)以及rw。许多声卡只允许1个进程1次进行记录或播放操作。
需要注意的是这里的调用语法与平常的不同,其第1个参数是可选的,而第2个参数是必填的。这是为了兼容旧的linuxaudiodev模块。
这里我们选择第1种写法,我们使用w的方式进行操作:

>>> dsp = ossaudiodev.open('w')

在该模块中还有1个openmixer方法用于打开1个混合设备,并返回1个OSS混合设备对象。我们可以指定使用混合设备的文件名,如果没有指定它将查找环境变量MIXERDEV,如果没有找到则回滚到/dev/mixer
接下来,我们进行音频设备的操作。在你从1个音频设备进行写入或读取操作之前,你必须按照正常的顺序调用下面3个方法:

  1. setfmt,设置输出的格式

  2. channels,设置通道的数字

  3. speed,设置样本的速率

另外,你可以使用setparameters方法一次性设置上面3个参数。

>>> dsp.setparameters(ossaudiodev.AFMT_U16_LE,2,44100)

上述写法等价于:

>>> fmt = dsp.setfmt(ossaudiodev.AFMT_U16_LE)
>>> channels = dsp.channels(2)
>>> rate = dsp.rate(44100)

其中关于音频设置的格式,我们可以通过音频设备对象的getfmts方法进行查询,主要格式有AFMT_U8AFMT_S16_LEAFMT_U16_LE等9种格式。其中今天大多数设备的常用格式是AFMT_S16_LE
关于设置的通道,主要有2种选择,其中1代表耳机的声音,而2代表立体声。一些设备可能大于2个通道,而一些高端设备可能不支持耳机。
而设置的样本速率的单位是每秒多少赫兹。大多数音频设备不知道负数的样本速率,常用的主要有5种,分别为8000,11025,22050,44100,96000。其中44100用于CD音质的音频,而96000用于DVD音质的音频。
接下来,我们需要打开1个音频文件,然后将其写入到音频设备中将其输出,这里我们通过write方法进行操作,这个方法写入python的字符串数据到音频设备并返回写入的字节数:

>>> data = open('out.mp3', 'rb').read()
>>> dsp.write(data)

在这个过程中,我们使用了1个mp3splt软件包用于分割mp3文件,下面我们将源mp3文件切分其2分钟到2分15秒这段,然后通过-o选项输出为out.mp3文件。

cat@yafeile-pc:~$ sudo pacman -S mp3splt
cat@yafeile-pc:~$ mp3splt windows.mp3 2.00 2.15 -o out
mp3splt 2.6.2 (09/11/14) - using libmp3splt 0.9.2
    Matteo Trotta <mtrotta AT users.sourceforge.net>
    Alexandru Munteanu <m AT ioalex.net>
THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
 warning: output format ambiguous (@t or @n missing)
 Processing file 'windows.mp3' ...
 info: file matches the plugin 'mp3 (libmad)'
 info: found Xing or Info header. Switching to frame mode... 
 info: MPEG 1 Layer 3 - 44100 Hz - Joint Stereo - FRAME MODE - Total time: 4m.32s
 info: starting normal split
   File "out.mp3" created                    
 Processed 5169 frames - Sync errors: 0   
 file split

我们调用音频对象的write的方法时出现了1个如下的错误:

[Error 5] Input/Output Error

之所以会出现这个问题,预计是设备无法进行解码。在这里我们需要安装另外1个包gstreamer0.10-plugins-bad:

cat@debian:~$ sudo aptitude install gstreamer0.10-plugins-bad

但是再次进行上述的操作,我们只能听到沙沙的声音。
实际上,在我们安装好oss系统后,系统有一些命令可以查看其一些信息,比如ossinfo显示oss的相关信息:

cat@debian:~$ ossinfo 
Version info: OSS 4.2 (b 2006/201212190848) (0x00040100) GPL
Platform: Linux/i686 3.2.0-4-486 #1 Debian 3.2.57-3 (debian)

Number of audio devices:    1
Number of audio engines:    6
Number of MIDI devices:        0
Number of mixer devices:    1
...

通过这个命令我们可以查看系统的设备信息。还有一个osstest命令用于测试oss系统是否正常工作:

cat@debian:~$ osstest
Sound subsystem and version: OSS 4.2 (b 2006/201212190848) (0x00040100)
Platform: Linux/i686 3.2.0-4-486 #1 Debian 3.2.57-3

*** Scanning sound adapter #-1 ***
/dev/oss/oss_ich0/pcm0 (audio engine 0): Intel ICH (2415)
- Performing audio playback test... 
  <left> OK <right> OK <stereo> OK <measured srate 48483.00 Hz (1.01%)> 
   
*** All tests completed OK ***

在这个过程中,会进行设备左右声音的测试。
另外,还有1个ossplay的命令用于播放音频文件,但是该命令默认支持wav,而对于mp3不怎么支持,比如我们播放上面那个文件:

cat@debian:/vagrant$ ossplay out.mp3 
out.mp3: Unrecognized audio file type.

可以看到,ossplay不认识这个音频文件类型,从而导致沙沙的声音。如果改用1个wav的音频文件则可以正常听到其声音了。

参考文章:

http://www.opensound.com/down…
http://www.ubuntugeek.com/how…

    原文作者:我勒个去
    原文地址: https://segmentfault.com/a/1190000005166964
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞