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