第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 使用lame对音频文件PCM进行转码为MP3格式

使用lame对音频文件PCM进行转码为MP3格式

时间:2021-04-19 14:04:32

相关推荐

使用lame对音频文件PCM进行转码为MP3格式

1、LAME简介

LAME是目前非常优秀的一种MP3编码引擎,可以把音频文件转为MP3格式。当达到320Kbit/s以上时,LAME编码出来的音频质量几乎可以和CD的音质相媲美,并且能保证整个音频文件的体积非常小,非常适合移动端平台上的MP3文件编码。

2、LAME文件编译

2.1 LAME源码下载

/projects/lame/files/lame 选择我们想要的版本进行下载,下载后的文件是常规的文件lame-3.99.5.tar.gz,用terminal(俗称黑框),切换到文件所在路径下,执行tar xzvf lame-3.99.5.tar.gz命令进行解压。

2.2 编译为ios使用的文件

编写shell脚本文件build_armv7.sh脚本,用脚本编译文件。

./configure \--disable-shared \--disable-frontend \--host=arm-apple-drawin \--prefix="./thin/armv7" \CC="xcrun -sdk iphoneos clang -arch armv7" \CFLAGS="-arch armv7 -fembed-bitcode -miphoneos-version-min=7.0" \LDFLAGS="-arch armv7 -fembed-bitcode -miphoneos-version-min=7.0" \make cleanmake -j8make install

--prefix:指定编译号的库放在哪个路径下;

--host:指定生成的库要运行的平台;

CC:指定编译工具编译链的路径,这里指的是gcc的路径;

CFLAGS:指定编译时的参数,-arch armv7表示库运行的目标平台,-fembed-bitcode指定打开bitcode选项,表示项目可以在enable-bitcode设置为YES的情况下使用,-miphoneos-version-min=7.0,表示最低支持的运行版本;

LDFLAGS:表示链接时的参数,与编译时参数相同;

--disable-shared:关闭动态链接库;

--disable-frontend:表示不编译出可执行文件;

把脚本放到解压出的源码中,在黑框中执行./build_armv7.sh进行编译,最后会在armv7目录下生成bin、lib、include、share四个目录,如果需要编译出其他架构的文件,修改armv7为arm64、x86_64、arm64等,执行脚本即可,最后可以通过执行lipo -create ./arm64/lib/libmp3lame.a ./armv7/bin/libmp3lame.a -output libmp3lame.a合并为一个静态库文件。

2.3 推荐另一个编译脚本

一个一个的编译有点麻烦,这里我找到一个大牛写的编译脚本,可以一次编译出所有平台的静态库文件,或者指定编译平台,并且会自动合并为一个静态库文件。大牛的写的脚本地址传送门,根据Readme文件中的说明执行,把脚本文件放到源码的文件夹的同级目录下,执行./build-lame.sh就会编译出全平台的静态库,./build-lame.sh armv7 arm64 x86_64只会编译这三个平台的静态库,脚本会默认链接输出,这里有个注意点,脚本里面写的路径是lame,所以我们把脚本所在目录修改为lame,这样才能正常编译,读者也可以修改脚本中的路径与实际路径相同。最终结果如图:

3、在ios项目中利用lame转码PCM文件为MP3

3.1 创建项目,导入静态库

3.2 编写编码工具类

mp3_encoder.hpp和mp3_encoder.cpp

//// Mp3Encoder.hpp// PhuketTour//// Created by 司伟红 on /12/23.// Copyright © 司伟红. All rights reserved.//#ifndef Mp3Encoder_hpp#define Mp3Encoder_hpp#include <stdio.h>#import "lame.h"class Mp3Encoder{private:FILE* pcmFile;FILE* mp3File;lame_t lameClient;public :Mp3Encoder();~Mp3Encoder();int Init(const char* pcmFilePath, const char* mp3FilePath, int sampleRate, int channels, int bitRate);void Encode();void Destory();};#endif /* Mp3Encoder_hpp */

//// Mp3Encoder.cpp// PhuketTour//// Created by 司伟红 on /12/23.// Copyright © 司伟红. All rights reserved.//#include "Mp3Encoder.hpp"Mp3Encoder::Mp3Encoder() {}Mp3Encoder::~Mp3Encoder() {}int Mp3Encoder::Init(const char *pcmFilePath, const char *mp3FilePath, int sampleRate, int channels, int bitRate){int ret = -1;pcmFile = fopen(pcmFilePath, "rb");if (pcmFile) {mp3File = fopen(mp3FilePath, "wb");if (mp3File) {lameClient = lame_init();lame_set_in_samplerate(lameClient, sampleRate);lame_set_out_samplerate(lameClient, sampleRate);lame_set_num_channels(lameClient, channels);lame_set_brate(lameClient, bitRate / 1000);lame_init_params(lameClient);ret = 0;}}return ret;}void Mp3Encoder::Encode(){int bufferSize = 1024 * 256;short *buffer = new short[bufferSize / 2];short *leftBuffer = new short[bufferSize / 4];short *rightBuffer = new short[bufferSize / 4];unsigned char* mp3_buffer = new unsigned char[bufferSize];size_t readBufferSize = 0;while ((readBufferSize = fread(buffer, 2, bufferSize / 2, pcmFile)) > 0) {for (int i = 0; i < readBufferSize; i++) {if (i % 2 == 0) {leftBuffer[i / 2] = buffer[i];} else {rightBuffer[i / 2] = buffer[i];}}size_t wroteSize = lame_encode_buffer(lameClient, (short int *) leftBuffer, (short int *) rightBuffer, (int)(readBufferSize / 2), mp3_buffer, bufferSize);fwrite(mp3_buffer, 1, wroteSize, mp3File);}delete [] buffer;delete [] leftBuffer;delete [] rightBuffer;delete [] mp3_buffer;}void Mp3Encoder::Destory(){if (pcmFile) {fclose(pcmFile);}if (mp3File) {fclose(mp3File);lame_close(lameClient);}}

3.3 在view中添加一个按钮,点击按钮的时候调用C++方法编译出mp3文件

- (IBAction)btnClick:(UIButton *)sender {NSLog(@"按钮点击事件");Mp3Encoder *encoder = new Mp3Encoder();// 源文件的的路径const char* pcmFilePath = [[CommonUtil bundlePath:@"vocal.pcm"] cStringUsingEncoding:NSUTF8StringEncoding];// 要生成的mp3文件的路径const char *mp3FilePath = [[CommonUtil documentsPath:@"vocal.mp3"] cStringUsingEncoding:NSUTF8StringEncoding];int sampleRate = 44100;int channels = 2;int bitRate = 128 * 1024;// 初始化解码器,传入源文件路径,生成的文件路径,采样频率,声道数,码率encoder->Init(pcmFilePath, mp3FilePath, sampleRate, channels, bitRate);// 编码encoder->Encode();//关闭文件encoder->Destory();delete encoder;NSLog(@"Encode Success");}

3.4 查看生成的文件,用电脑播放查看是否正常

注意,如果编译的时候没有选择x86_64平台,则不能在模拟器上运行,需要真机运行,真机文件的导出方式,需要在info.plist中增加,UIFileSharingEnabled这个Key, 并设置该值为YES即可,在填写完UIFileSharingEnabled并回车后, 发现会自动更正为Application supports iTunes file sharing, 将值设置为YES即可。然后手机连接电脑,即可看到文件,拖到电脑中可以播放是否编码成功。如图:

这就是利用lame编码PCM为mp3文件的方法。最后附上demo地址

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。