Linux移植Mp3库以及注意点
核心板要播放mp3不是说简单就简单的事情
首先应该确定板子上的音频通道是好的。至少能够播放wav吧
准备工作:
- 看下网上资料,想想MP3是有版权的,肯定是需要是解码库的
- 解码库什么合适?
- 这些解码库,肯定是可以下载,由于考虑到核心板,肯定也需要源码能够进行交叉编译
先是漫无目的搜索,想到Qt是不是可以播放,Python是不是可以。现实是残酷的,了解到的Qt,Python都是实现接口部分,并不解决解码库的问题。反正一句话,就是要先有解码库才可以。
搜索一会,把问题集中到一起了。Linux下Mp3解码库 libmad,madplay是鼎鼎大名的播放器。
既然,确定目标了,那么就解决解码库的事情。Baidu,madplay,一堆东西,也有很多好的文章,看样子很多人在研究,相信肯定有戏。先找个写得详细点入手吧。
解码库,基本上用的以下三种文件,如果系统没有装过,都需要先下载安装的
- zlib-1.2.3.tar.tar用于文件的压缩和解压
- libid3tag-0.15.1b.tar.gz mp3的解码库
- libmad-0.15.1b.tar.gz madplay的库文件
- madplay-0.15.2b.tar.gz 播放程序的压缩包,mp3播放器的源码
准备工作的插曲
(插曲:)既然,自己的编译的。自然想到先在Ubuntu试验下,结果,发现本人的虚拟机下Ubuntu的竟然没有声音,播放wav,也没声音(这个到一直没有发现这个问题。突然发现,觉得很奇怪)。
进入系统设置的声音设置,发现是静音的,但怎么修改不行,都是静音的,是很奇怪。(windows下从来没碰到过问题)
后来,看网上资料,说可以先看有没有设备。 “aplay -l”
竟然,没找到硬件设备列表。说明驱动没有装好。原来Ubuntu要装alsa的声音驱动。
|
先卸载原先的alsa sudo apt-get remove linux-sound-base alsa-base alsa-utils |
sudo apt-get install xmlto libasound2-dev |
sudo apt-get install linux-sound-base alsa-base alsa-utils |
下载 一个lib alsa-lib-1.0.25.tar.bz2 //这个不是最新的,但不是最新就最好,要自己匹配的,我就装过好几个版本,能装上去,但无效。 后来,发现Ubuntu 14.04,装这个版本是可以用的。。。因此,就选这个版本。可能其他版本可能也能用。 |
安装 alsa-lib-1.0.25.tar.bz2。先解压 ./configure Make Make install |
Alsa驱动重新装了,“aplay -l”可以看到设备列表了,以为这样就可以了,小激动了下。结果事实是残酷的,仍然是静音,仍然没有声音!!!!
继续百度,找原因。。。。
说用“alsamixer”可以调节声音的,于是,就输入了,弹出一个类似窗口的输入,修改,每个选项都改80以上。
以为这样就可以了,小激动了下。结果事实是残酷的,仍然是静音,仍然没有声音!!!!
继续百度,果然真理掌握少数人手里,看以下帖子,恍然大悟
https://blog.csdn.net/guodongxiaren/article/details/25700619
好了,到此为止Ubuntu终于可以输出声音,至少播放wav是ok的了。
继续来折腾MP3解码库的事情。
Ubuntu下编译MP3解码库
首先是Ubuntu下的编译,即x86版本:
- zlib-1.2.3.tar.tar用于文件的压缩和解压
- libid3tag-0.15.1b.tar.gz mp3的解码库
- libmad-0.15.1b.tar.gz madplay的库文件
- madplay-0.15.2b.tar.gz 播放程序的压缩包,mp3播放器的源码
ps:这几个库在Ubuntu下安装,问题不多,网上很多文章都写的很清楚,有些问题也写了七七八八的。但原则,还是不要看一篇文章走到底,一般是不行的,多综合其他文章来看,当然碰到过钉子,才知道集众家之长的好处。
zlib编译,安装
# tar -zxvf zlib-1.2.3.tar.gz 解压
进入解压的目录,输入:“/usr/local/lib/mad_x86”是指存放目录
./configure --prefix=/usr/local/lib/mad_x86
然后,make
然后,make install
---这个是基本没碰到什么问题,一切顺利
libid3tag编译
# tar -zxvf libid3tag-0.15.1b.tar.gz 解压
进入解压的目录,输入:
./configure --prefix=/usr/local/lib/mad_x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_x86/include LDFLAGS=-L/usr/local/lib/mad_x86/lib
然后,make
然后,make install
---这个是基本没碰到什么问题,一切顺利
libmad 编译
# tar -zxvf libmad-0.15.1b.tar.gz
进入解压的目录,输入:
./configure --prefix=/usr/local/lib/mad_x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_x86/include LDFLAGS=-L/usr/local/lib/mad_x86/lib
然后打开Makefile,找到"-fforce-mem"它并删除 (否则会报错)
然后,make
然后,make install
---这个是基本没碰到什么问题,一切顺利(除了-fforce-mem错误)
madplay 编译:
# tar -zxvf madplay-0.15.2b.tar.gz 解压
进入解压的目录,输入:
./configure --prefix=/opt/madplayer --with-alsa --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_x86/include LDFLAGS=-L/usr/local/lib/mad_x86/lib
然后,make
然后,make install
----ps,网上帖子大部分不是这样,一般都是缺少“--with-alsa”的,这样编译什么的都ok的,但播放的时候会提示“audio: /dev/dsp: 没有那个文件或目录”,在Ubuntu也可以解决的。例如:
解决方法:
在当前目录下敲上两条命令:
1 mknod /dev/dsp c 14 3
2 chmod 666 /dev/dsp
如果敲了以上两条命令还提示/dev/dsp:没有这个设备(可能系统已经不支持oss的)
可以继续执行如下命令:(在CentOS7 下,以下两条命令是不行的,所以此方法在CentOs 7下是无效的)
3 modprobe snd-pcm-oss
4 modprobe snd-mixer-oss
|
|
这个解决办法不好,每次重启之后,又得重新这样设置下,否则仍然会提示错误的。
原因,madplay默认是走oss的,但Ubuntu14 是用alsa的,所以不对的。
当然,最佳的解决就是添加“--with-alsa”这个编译参数
好了,如果你的Ubuntu下,安装正常alsa跟以上编译过程,肯定没有问题。
交叉编译---ARM版本的mp3解码库
由于arm核心板,已经带了alsa的驱动(在核心板上敲“aplay -l”,看看有没有设备列表出来。如果有的话,就说明ok的,否则要先移植alsa库),这里就不重复alsa的移植了,事实上网上也有很多资料。
当然,首先Ubuntu也是要安装好交叉编译环境,arm-linux编译环境要安装好。
套路上,还是跟x86的一致:
- zlib-1.2.3.tar.tar用于文件的压缩和解压
- libid3tag-0.15.1b.tar.gz mp3的解码库
- libmad-0.15.1b.tar.gz madplay的库文件
- madplay-0.15.2b.tar.gz 播放程序的压缩包,mp3播放器的源码
zlib编译,安装
# tar -zxvf zlib-1.2.3.tar.gz 解压(重新搞个文件夹进行解压,不要跟原先x86重复了。后面的操作都是一样)
cd到解压之后的目录,输入:“/usr/local/lib/mad_arm”是指存放目录(是arm)
./configure --prefix=/usr/local/lib/mad_arm
此时,会生成MakeFile文件,打开zlib-1.2.3目录下的Makefile文件,按以下内容修改并保存:(主要意思是把默认编译器改成arm-linux)
CC=arm-linux-gcc
LDSHARED=arm-linux-gcc
CPP=arm-linux-gcc -E
AR=arm-linux-ar rc
RANLIB=arm-linux-ranlib
然后,make
然后,make install
---这个是基本没碰到什么问题,一切顺利
libid3tag编译
# tar -zxvf libid3tag-0.15.1b.tar.gz 解压
cd到解压之后的目录,输入:
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/usr/local/lib/mad_arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_arm/include LDFLAGS=-L/usr/local/lib/mad_arm/lib
然后,make
然后,make install
---这个是基本没碰到什么问题,一切顺利
libmad 编译
# tar -zxvf libmad-0.15.1b.tar.gz
cd到解压之后的目录,输入:
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/usr/local/lib/mad_arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_arm/include LDFLAGS=-L/usr/local/lib/mad_arm/lib
然后打开Makefile,找到"-fforce-mem"它并删除 (否则会报错)
然后,make
然后,make install
---这个是基本没碰到什么问题,一切顺利(除了-fforce-mem错误)
(/usr/local/lib/mad_arm/lib,这个目录下的所有文件都要拷贝到核心板 /lib 下)
madplay 编译:
# tar -zxvf madplay-0.15.2b.tar.gz 解压
cd到解压之后的目录,输入:
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/opt/madplayarm --with-alsa=/usr/share/bluetooth/lib --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_arm/include LDFLAGS=-L/usr/local/lib/mad_arm/lib
这里需要说明的是
--with-alsa=/usr/share/bluetooth/lib 是我的alsa arm版编译存放路径
然后,make
如果需要静态编译,需要加上:
#arm-linux-gcc -Wall -g -O2 -o madplay *.o -L/usr/local/lib/mad_arm/lib -lid3tag -lmad -lz -lm -static
然后,make install
----ps,网上帖子大部分不是这样,一般都是缺少“--with-alsa”的,这样编译什么的都ok的,但播放的时候会提示“audio: /dev/dsp: 没有那个文件或目录”,在Ubuntu也可以解决的。
因此,解决办法只能是添加“--with-alsa”这个编译参数
测试播放:
Up.mp3为要测试的mp3文件
以下为测试命令:
system("./madplay -o wav:- Up.mp3 | aplay &"); //播放
system(“./madplay -r -o wav:- Up.mp3 | aplay &”); //循环播放:参数-r
system("killall -9 madplay"); //利用system函数调用killall命令将madplay终止掉
system("killall -STOP madplay &"); //利用system函数调用killall命令将madplay暂停
system("killall -CONT madplay &"); //利用system函数调用killall命令恢复madplay的播放
./madplay -v --start=0:1:20.11 -o wav:- Up.mp3 | aplay &
这里要说明下,有个坑,在Ubuntu下,直接这样可以的
./madplay Up.mp3
./madplay Up.mp3 -o tt.wav Up.mp3 转成 tt.wav
但在arm板子上是不行的,仍然提示“/dev/dsp:没有这个设备”,一开始一直以为编译的时候没有添加“--with-alsa”,实际是添加的。
后来才知道,要添加参数“./madplay -o wav:- Up.mp3 | aplay”才可以的。这个很难能够想到的,是个坑。