首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> Symbian >> 多媒体 >> 正文
创建MP3解码器
作者:雨夜孤星    文章来源:本站原创    更新时间:2006-3-22 22:37:44

采用SymbianMAD(MPEG音频解码库)用法

                              作者: Denis Mingulov     2005.4.28

前段时间我在newlc.com写了为Series 60创建MP3播放器的程序。我收到了许多关于MP3解码并运用在Symbian上的邮件。这里采用SymbianMAD(MPEG音频解码库)用法来解决问题。

绪论

因为Symbian 7.0中可以通过MMFsmartphones在播放MP3, 但如果你的手机不支持 MP3解码,或如果你想自己接收解码MP3。这里我将演示如何采用Symbian中的MAD(MPEG音频解码,libmad)用法。

为什么使用MAD? 因为它是高品质的MPEG音频解码器,并且它已经在ARM下测试通过(也就是说不同的微型电脑和掌上MP3可以使用它)。将MAD移植到Symbian

为了得到MAD来源,将需要以下文件:

?      inc

o     D.dat

o     imdct_s.dat

o     qc_table.dat

o     rq_table.dat

o     sf_table.dat

o     bit.h

o     config.h

o     decoder.h

o     fixed.h

o     frame.h

o     global.h

o     huffman.h

o     layer12.h

o     layer3.h

o     mad.h

o     stream.h

o     synth.h

o     timer.h

o     version.h

?      src

o     bit.c

o     decoder.c

o     fixed.c

o     frame.c

o     huffman.c

o     layer12.c

o     layer3.c

o     stream.c

o     synth.c

o     timer.c

o     version.c

o     imdct_l_arm.S

固定静态函数/ 变量为非静态.(变量可以被转换为"静态的const")

编辑mad.h,,为设备对象和FPM_DEFAULT定义FPM_ARM. 如果你的WINS编译器不支持big inline,需要这样做:

# ifndef__WINS__

inline

#endif

可能在layer3.c III_decode函数中引起堆栈错误,即在字符串:

mad_fixed_t xr[2][576];

你可以为变量分配存储器或(在简单程序的情况下)WINS对象使用窍门,置成静态变量.在真机上它会正常运行的.

imdct_l_arm.S是针对ARMI最佳化的,使用它必须添加它的报头(函数 III_imdct_l) .

# ifndef __WINS__

void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], unsigned int block_type);

# else

static

void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], unsigned int block_type)

注意! 优化的 imdct_l_arm 不能在THUMB下编译,所以只是ARMI 对象被使用.

创建MP3解码动态链接库

使用MP3解码器的最好方法是DLL,你可以编译一次或有效的若干次,没有任何的平台特殊事件。所以使用ETTYPE.libmad\epoc32\include\libc加入在MM文件中的SYSTEMINCLUDE。如果想使用优化的III_imdct_l函数,加入到MMP

#if !defined (WINS)

SOURCE  imdct_l_arm.S

#endif

同样加入到bld.inf(所以imdct_l_armTHUMB编译)

PRJ_PLATFORMS

ARMI WINS

如果在iii_decode函数中为堆栈错误使用窍门并且在WINS库中没有_chkstk,需要自己添加它(empty void _chkstk())

为了在程序中使用DLL,添加函数。

你可以使用基于madplayMP3解码器的主循环:

   读文件到缓冲器

   MP3结构解码

   应用滤波器

   合成解码到PCM样本

   重新取PCM样本

过滤  大多数的Symbian smartphones不支持立体声播放,所以这里你可以实现单一声音合成。并且可以使用平衡器。

频率  不需要做没必要的计算,如果所需频率大于当前架框流通频率的一半,在申请滤波器后转换架框选项:

Frame.options |= MAD_OPTION_HALFSAMPLERATE;

编辑  推荐使用 GCC 3 编译这一程序。根据我的测试它比普通的GCC 2.95解码器速度快20%。不要忘记MADGNU General Public License version 2下是得到许可的。

希望文章对你能有所帮助,同时欢迎写出注释或提出宝贵意见。

相关文章:
使用libmad播放mp3文件
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号