最近在练习一个小项目,用 C 写一个流媒体服务器,往多播组同时发送多个频道的音乐,客户端通过 socket 接收,然后通过管道输送给 mpg123 进行解码播放。
现在遇到的情况是,mpg123 在 rhel 5.8 上使用正常,如果在 ubuntu 12.04 上使用,则提示下面的错误:
sparkle@ubuntu:~$ mpg123 /media/DISK/blo_win.mp3
[oss.c:172] error: Can't open default sound device!
[audio.c:627] error: failed to open audio device
[audio.c:180] error: Unable to find a working output module in this list: oss
[audio.c:529] error: Failed to open audio output module
[mpg123.c:869] error: Failed to initialize output, goodbye.
根据错误提示,查看源代码 oss.c 172 行前后:
...
if(!ao->device) {
ao->device = "/dev/dsp";
usingdefdev = 1;
}
ao->fn = open(ao->device,O_WRONLY);
if(ao->fn < 0)
{ // ==> 呃,这里居然用了另一种代码风格...
if(usingdefdev) {
ao->device = "/dev/sound/dsp";
ao->fn = open(ao->device,O_WRONLY);
if(ao->fn < 0) {
if(!AOQUIET) error("Can't open default sound device!");
return -1;
...
从代码来看,是打开 /dev/dsp 或 /dev/sound/dsp 失败,我查看了 /dev 目录,没有这两个文件。
首先当然是 google 解决办法,很可惜,又没有搜到直接的解决办法。但是了解到还有一个类似的软件叫 mpg321,跟 mpg123 的使用几乎相同。于是安装之,果然可以播放了,但是有点小瑕疵,中文显示乱码。
虽然可以工作了,但我仍心有不甘,mpg123 在最大的 Linux 发行版上居然无法正常使用,这说不过去啊。
看了 mpg123 的帮助和 man 手册,也没有收获,只是说通过 -a 选项可以指定输出设备,但我不知道我的音频设备的路径...
google「linux oss」关键词,获知 oss 和 alsa 是 Liunx 的两种提供声卡驱动的组件,Linux 上从 2.6 内核开始 oss 被废弃,改用 alsa。而 Ubuntu 12.04 是 3.2,所以已经没有自带 oss 了。而 rhel 5.8 虽然也是 2.6 了,但是仍保留了 oss。
在终端输入 mpg123 后再按tab键,出现以下结果
sparkle@ubuntu:~$ mpg123
mpg123 mpg123-alsa mpg123.bin mpg123-esd mpg123-nas mpg123-oss
看到有一个名为 mpg123-alsa 的命令,抱着试试看的态度运行之,果然,听到了美妙的音乐声,而且中文也能正确显示了,perfetc!
sparkle@ubuntu:~$ mpg123-alsa /media/DISK/blo_win.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.12.1; written and copyright by Michael Hipp and others
free software (LGPL/GPL) without any warranty but with best wishes
Directory: /media/DISK/
Playing MPEG stream 1 of 1: blo_win.mp3 ...
Title: Blowing In The Wind Artist: 鲍勃 迪伦
Comment: WWW.TOP100.CN 巨鲸音乐网 Album: The Best Of Bob Dylan
Year: 1997-1-1 0:00:00
Genre: 乡村音乐【Country Music】,流行音乐【Pop Music】
MPEG 1.0 layer III, 192 kbit/s, 44100 Hz stereo
2013/03/20 补充
后来发现上面问题产生的原因是我使用的 mpg123 版本太老。目前 mpg123 的最新版本是 1.15.1,而我使用的版本是 1.13.4,这个版本默认使用 oss 输出音频,而从 1.13.6 开始,已改为默认使用 alsa 输出音频。