资讯专栏INFORMATION COLUMN

使用ossaudiodev播放音频

Winer / 3431人阅读

摘要:其中用于音质的音频而用于音质的音频。如果改用个的音频文件则可以正常听到其声音了。

原文地址: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个方法:

setfmt,设置输出的格式

channels,设置通道的数字

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 
    Alexandru Munteanu 
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... 
   OK  OK  OK  
   
*** 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://www.ucloud.cn/yun/37951.html

相关文章

  • web Audio学习与音频播放

    摘要:注文档上说明支持标签支持的所有音频格式。音频播放音频数据到手,接下来就是播放啦。文件上传后,我们拿到了音频形式的数据,接下来使用方法播放音频数据,再到就可以播放了。音量节点关联与播放将这些节点起来就可以播放了。代码地址制造噪音并播放。 随着浏览器的越发强大,用浏览器自带的api操作音频已经不是难事了。我们来使用web audio api简单地处理下音频资源。 简介 在学习web aud...

    xiongzenghui 评论0 收藏0
  • 微信小程序音频IOS无法播放问题总结

    摘要:问题微信小程序,将文字转换为语音后,使用音频进行播放。在安卓手机下可以正常播放,在下不行。需要对接口的文本字符串参数进行编码比如哈哈哈哈哈哈哈哈哈没有做编码,直接上文本的,也会出现安卓行不行的情况。 【问题】 微信小程序,将文字转换为语音后,使用音频进行播放。在安卓手机下可以正常播放,在IOS下不行。 【环境】 微信小程序库版本2.3.0百度语音合成服务 【解决方法】 正确代码: //...

    Soarkey 评论0 收藏0
  • Vue+ElementUI: 手把手教你做一个audio组件

    摘要:不显示下载不显示静音不显示音量条不显示进度条只能播放一个不要快进按钮例如父组件这样回雪月花青春一点点语法大多数时候,我们希望页面上播放一个音频时,其他音频可以暂停。可以把一个类数组转化成数组,这个是我常用的。 showImg(https://segmentfault.com/img/remote/1460000016177005?w=619&h=343); 目的 本项目的目的是教你如...

    U2FsdGVkX1x 评论0 收藏0
  • BREW 应用中的音频播放

    摘要:以下就是用这种方法时应用所作的处理判断要播放的音乐播放当前音乐在音乐播放完后继续播放在应用程序中断时作的操作是恢复时的操作是判断要播放的音乐循环播放另一种办法就是调用回调函数如或。 BREW中支持的音频格式主要分为两类:基于MIDI的文件格式和特殊编码的音频文件格式。基于MIDI的文...

    lsxiao 评论0 收藏0
  • 基于apicloud原生模块实现的凌乱的单点音频播放凌乱功能总结

    摘要:个人网站最近刚写了一个手机在线播放的电影站缘由公司项目使用开发混合式,用到了官方提供的原生音频播放模块来做单点音频播放功能。首页和播放页始终进行暂停事件监听。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是永不停息的追求。 个人网站:https://www.linganmi...

    shery 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<