一切为了听歌
上次用了libmad 搞了mp3的解码+alsa的音乐播放,但是不可能只是支持一种格式。所以改改改改
需要支持 mp3,flac,m4a,wav,wmv…..格式
而且在这里我们还有resample channels 等一些关于音频的其他参数的需求,最终我们选用了sox ,sox提供了带其他解码库的编译选项,比方说ffmpeg的库,libavxxxx,libflac,lame,twolame等具体可以在官方的说明里面找到,但是感觉最重要的还是ffmpeg。
交叉编译肯定就大家自己动手了。
接下来说一下编译的时候碰到的问题。
编译的时候无法生成动态库。
无法生成so文件。编译过程中checking if libtool supports shared libraries... no
这里我蒙蔽了好一会儿。后来查到是arch=arm的问题,把arch=arm-none-linux就好了
sox带libavxxxx编译的时候,出现找不到函数
checking for av_open_input_file in -lavformat... no
首先你要确定你的库路径是对的。
readelf -a libavformat | grep av_open_input_file
看看到底有没有。
我用的sox 14.4.1 2013年发布的,但是av_open_input_file这个函数在后面的某一年的ffmpeg里面被废弃了,所以,如果你的ffmpeg版本太新也是没有这个函数,肯定是编译不过去的。后来我选用了比较早的ffmpeg的版本,这个问题就解决掉了。wma和ape的支持
如果你直接使用
sox xxxx.wma -t alsa
来播放的wma文件的话,即使在有ffmpeg库的情况下也是不能播放的(这仅仅是我自己测试到的情况,后面版本如果有修改的话,当我没说)。在这种情况下要
sox -t ffmpeg xxxx.wma -t alsa
直接指定输入文件使用ffmpeg处理,在编程中在open_read的时候,有个一type的参数,正常情况下为null,在此处直接设置为ffmpeg就可以播放了。个别破音
在播放某一些音乐的时候,会有一些破音的情况,硬件上这个问题应该是大头,但是我们也可以通过缩小输出的幅度来防止这种情况的发生可以在播放的时候加入 vol的effect 然后加入一个参数比方0.5 0.3,这样音量就会x0.5 x0.3,从而达到减小输出音量的效果。sox的rate效果
在使用sox的rate效果的时候,比方把96k转化为48k或者其他频率的音频播放时,会出现卡顿的情况,这种情况下,可以试着把rate的转换效果降低,默认是高质量的,可以通过为rate添加参数的方法,降低效果,减少单次转换的运算量,使得播放顺畅。
这是我在做音频的一些碰到的一些问题,希望能帮助到别人,如果有错,劳烦告知,谢谢。
有一些我还是没有解决问题,如果哪位大神会,也请帮助我一下
我使用的是imx6ul,但是对他的arsc表示无奈,不会用,本来想要通过这个模块直接硬件转rate,但是我发现imx6ul没有44100的倍数的时钟。手册上写的支持44.1,48等一系列的都可以支持,但是我不会用。
14.4.1中存在内存泄漏的问题。本来准备使用14.4.2,但是发现14.4.2不支持ffmpeg了,心累,bug怎么办。。。 最新一个版本更新隔了一年,sox是准备凉凉了吗
发现新的情况 好像跟格式有关系 wma和m4a,内存涨的特别快,但是wav mp3之类的就没有明显的增长,这两个格式的支持是在ffmpeg中支持的,但是ffmpeg的库有点老
下次还有这种应用的话,还是尝试换种方式