Lame编解码MP3,解决undefined reference to `init_xrpow_core_sse'问题

        由工作需要实现ARM板上MP3与wav格式互转,作为编上位机软件的我感觉这事根本搞不定,于是搜罗开源的库,最有名的应该是lame 和ffmpeg了,简单了解下ffmpeg支持多个格式文件的解码,貌似没有mp3编码功能,于是直接下载lame开调。lame是供学习mp3编解码用的

简单纪录下这几天的工作成果:

  1.http://lame.sourceforge.net/    下载了最新版3.100

  2.ubuntu虚拟机中解压缩,打开Install,编译过程写的很详细

     ./configure   --prefix=/usr/local/lame

     make

     make install

   好了,生成的库和文件就在/usr/local/lame目录下了,这个默认是Ubuntu系统的环境,那就先试下吧。

   照着USAGE中提示的命令,在/usr/local/lame/bin目录下, 

    ./lame  -f  -b128  /root/mix.wav  /root/mix.mp3

   nice,成功了。如此简单,开始移植吧,把编译器换成arm交叉编译器,查了查参数貌似这样。

    ./configure   --prefix=/usr/local/lame  --host=arm-unknown-linux-gnu

    make

    duang!报错了

../libmp3lame/.libs/libmp3lame.a(quantize.o): In function `init_xrpow_core_init':
quantize.c:(.text+0x223): undefined reference to `init_xrpow_core_sse'
collect2: error: ld returned 1 exit status

Makefile:468: recipe for target 'lame' failed

    提示缺少定义,查找源文件找到这行,看的也不大明白,应该是编译条件上出问题了,度娘了半天没一个方法能解决的。又开始尝试把源码加到QT中,调用函数接口来实现,把lame.h加进来,发现libm3lame库中都是解决MP3编解码最原始的函数,实际应用很不方便,应用的代码在frontend中,frontend中的函数考到QT下编译又出来诸多错误和报警,很是不爽,而且lame说调用源码比调用执行文件编码效率要低,心中一万头奔过。。。决定还是从编译问题上下手

  最后,经高手提示,直接使用make方式编译,修改Makefile.unix文件,记得把之前的删掉从头来

# generic defaults. OS specific options go in versious sections below
PGM = lame
CC = gcc

CC_OPTS =  -O

makefile中CC代表C语言编译器,修改CC=arm-linux-gnueabihf-gcc

具体编译器根据自己需求选择了。直接编译可能会出错,好像是arm不兼容vbr的功能。

还需要修改BRHIST_SWITCH 和LIBTERMCAP ,这两行屏蔽掉

##########################################################################
# LINUX
##########################################################################
ifeq ($(UNAME),Linux)
#  The frame analyzer depends on gtk1.2. Uncomment the next 2 lines to get it
#   GTK = -DHAVE_GTK `gtk-config --cflags`
#   GTKLIBS = `gtk-config --libs`
# Comment out next 2 lines if you want to remove VBR histogram capability
 #  BRHIST_SWITCH = -DHAVE_TERMCAP -DHAVE_TERMCAP_H
 #  LIBTERMCAP = -lncurses
#  uncomment to use LIBSNDFILE
#   SNDLIB = -DLIBSNDFILE
#   LIBSNDFILE=-lsndfile

保存。开始编译make -f Makefile.unix UNAME=linux ARCH=arm

编译成功后,照着Ubuntu系统生成的/usr/local/lame目录,移植frontend中lame到bin,移植include中lame.h,移植libmp3lame中libmp3lame.a,其他的删掉,把lame文件夹打包移植到ARM同样位置,

到/usr/local/lame/bin目录下尝试下编码./lame -f -b128 .wav .mp3

大功告成,哈哈。。修改/etc/profile中PATH,照猫画虎增加一个/usr/local/lame/bin,就可以直接在命令行掉lame命令了。

尝试了下解码功能lame --decode  mix.mp3  mix.wav

完美,瞬间觉得开源太强大了,具体使用还要多看看USAGE文件。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Windows 平台上使用 DirectShow 进行音频编码,需要编写一个 DirectShow 滤镜来实现。下面简单介绍如何使用 LAME 实现音频编码。 首先,需要在 DirectShow 滤镜引入 LAME 的头文件和文件,然后在滤镜的构造函数初始化 LAME 编码器,示例代码如下: ```c++ #include <lame/lame.h> class CLameEncoderFilter : public CTransformFilter { public: CLameEncoderFilter(LPUNKNOWN pUnk, HRESULT* phr); ~CLameEncoderFilter(); // ... private: lame_global_flags* m_pLameGlobalFlags; }; CLameEncoderFilter::CLameEncoderFilter(LPUNKNOWN pUnk, HRESULT* phr) : CTransformFilter(NAME("LAME Encoder Filter"), pUnk, CLSID_LameEncoderFilter) { // 初始化 LAME 编码器 m_pLameGlobalFlags = lame_init(); lame_set_in_samplerate(m_pLameGlobalFlags, 44100); lame_set_out_samplerate(m_pLameGlobalFlags, 44100); lame_set_num_channels(m_pLameGlobalFlags, 2); lame_set_brate(m_pLameGlobalFlags, 128); lame_init_params(m_pLameGlobalFlags); // ... } ``` 在滤镜的 Transform() 函数,可以使用 LAME 提供的 lame_encode_buffer() 或 lame_encode_buffer_interleaved() 函数对输入的 PCM 数据进行编码,并将编码后的 MP3 数据输出到输出端口。示例代码如下: ```c++ HRESULT CLameEncoderFilter::Transform(IMediaSample* pIn, IMediaSample* pOut) { // 获取输入数据指针和长度 BYTE* pInData = nullptr; pIn->GetPointer(&pInData); int nInSize = pIn->GetActualDataLength(); // 创建输出数据缓冲区 BYTE* pOutData = nullptr; int nOutSize = nInSize; // 假设编码后的数据大小和输入数据大小相同 pOut->GetPointer(&pOutData); pOut->SetActualDataLength(nOutSize); // 编码 PCM 数据为 MP3 数据 int nRet = lame_encode_buffer_interleaved(m_pLameGlobalFlags, (short*)pInData, nInSize/4, pOutData, nOutSize); if (nRet < 0) { // 编码失败 return E_FAIL; } // ... return S_OK; } ``` 注意,在使用 LAME 编码音频数据时,需要根据输入数据的格式选择使用 lame_encode_buffer() 或 lame_encode_buffer_interleaved() 函数。上面的示例使用了 lame_encode_buffer_interleaved() 函数,因为输入数据是交错的 PCM 数据。如果输入数据是分离的左右声道 PCM 数据,则应该使用 lame_encode_buffer() 函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值