1 内容介绍

1,本文主要介绍如何使用lame库,将pcm文件编码为mp3文件,不使用ide.

2,环境为macos.各个环境的代码都是一样的,主要是编译库的脚本不一样.

3,打算写一个整合了ios,android,centos,windows,macos上的编译脚本,发布为另一篇文章.

2 编译lame库

1,编译lame库的脚本,将在整理之后发布出来.

2,暂时可以先下载已经编译好的版本,for macos!

https://pan.baidu.com/s/11wyA7QuYuB6YUd-FyqYgcg?pwd=j0f9

3 编写源代码main.c文件

#include <stdio.h>
#include <lame/lame.h>
#include <stdlib.h>FILE *pcmFile;
FILE *mp3File;
lame_t lameClient;int init(char *pcmFilePath, char *mp3FilePath, int sampleRate, int channels, int bitRate);
void encode();
void destroy();int main(int argc, char *argv[])
{//输入参数.char *pcmFilePath, *mp3FilePath;int sampleRate = 44100;int channels = 2;int bitRate = 44100 * 2 * 8;printf("There are %d params\n", argc);for (int i = 0; i < argc; i++){printf("param %d:%s\n", i, argv[i]);if (i == 1){pcmFilePath = argv[1];}else if (i == 2){mp3FilePath = argv[2];}}int ret = init(pcmFilePath, mp3FilePath, sampleRate, channels, bitRate);if (ret){printf("error!");exit(ret);}encode();destroy();return 0;
}int init(char *pcmFilePath, char *mp3FilePath, int sampleRate, int channels, int bitRate)
{int ret = -1;pcmFile = fopen(pcmFilePath, "rb");if (!pcmFile){printf("pcm file open failed!\n");return -1;}mp3File = fopen(mp3FilePath, "wb");if (!mp3File){printf("mp3 file open failed!\n");return -1;}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 encode()
{//一次操作256KB大小的数据.int bufferSize = 1024 * 256;//一个short是2个字节.short *buffer = calloc(bufferSize / 2, sizeof(short));short *leftBuffer = calloc(bufferSize / 4, sizeof(short));short *rightBuffer = calloc(bufferSize / 4, sizeof(short));unsigned char *mp3Buffer = (unsigned char *)malloc(bufferSize);size_t readBufferSize = 0;// 一次读bufferSize/2个2个字节的数据==读一个bufferSize的数据.// 每次读一个float,左右声道交错存储.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), mp3Buffer, bufferSize);//写入文件fwrite(mp3Buffer, 1, wroteSize, mp3File);}free(buffer);free(leftBuffer);free(rightBuffer);free(mp3Buffer);
}void destroy()
{if (pcmFile){fclose(pcmFile);}if (mp3File){fclose(mp3File);lame_close(lameClient);}
}

4 编译

如果是clang编译器:

clang -L./lame-3.100/lib/  -I./lame-3.100/include -lmp3lame main.c

如果是gcc编译器:

gcc -L./lame-3.100/lib/  -I./lame-3.100/include -lmp3lame main.c

两个编译器的命令是一致的.

1,-lxxx,自动寻找libxxx.a,或者libxxx.so

2.-Lxxx,表示添加库搜索路径.

3,-Ixxx,表示增加头文件搜索路径.

4,库搜索路径包含软链时,ld提示文件夹找不到.

5,没有指定输出文件名,默认的输出结果为a.out

5 运行

./a.out timeless.pcm timeless.mp3

1,timeless.pcm为输入的pcm文件,timeless.mp3为输出mp3文件.

2,注意pcm文件必须为44100的采样率,双声道,采样深度为16bit.

[图片上传失败…(image-13fa3e-1661690480718)]

测试音频文件也提供了

https://pan.baidu.com/s/1Vdoo2ieEump-zANcXLab5g?pwd=bw4w

该音频文件为timeless.pcm,44100采样率,双声道,采样深度为16bit.

6 总结

1,timeless.mp3,是小编最喜欢的歌曲之一,时间是最宝贵的财富,希望我们都能珍惜当下.

2,这个系列好久之前就想写了,拖了好久.

macos上使用lame将pcm文件编码为mp3不使用ide相关推荐

  1. Android使用lame将PCM文件转码为MP3文件

    Android使用lame将PCM文件转码为MP3文件 1. 软件版本 Android Studio版本:4.2 lame版本:3.100 编译参考:centos7使用ndk编译lame 2. 项目配 ...

  2. 如何在前端删除项目中的文件_如何在macOS上恢复已删除的文件

    有时候不小心删除了我们不打算删除的MacBook上的文件.在MacBook上恢复永久删除的文件非常困难,但这并非不可能.在本文中,我们将指导您如何恢复MacBook上最近恢复的文件或永久删除的文件.从 ...

  3. macOS上有哪些视频无损压缩和编码转码软件

    macOS 上常用的视频无损压缩和编码转码软件有 Handbrake.FFmpeg 和 MEGui.

  4. Android使用LAME将pcm文件转mp3文件

    Android使用LAME将pcm格式转mp3格式 lame介绍:LAME是一款开源的MP3编码器,被认为是中高比特率和VBR的最佳MP3编码器,质量和速度方面的改进仍在继续,可能使LAME成为仍在积 ...

  5. java把pcm文件转换成mp3文件

    要将 PCM 文件转换为 MP3 文件,您可以使用 Java 实现.下面是一个可以将 PCM 文件转换为 MP3 文件的示例代码: import java.io.BufferedInputStream ...

  6. java ftp 设置编码_java ftp上传下载,下载文件编码设置

    /** * Description: 从FTP服务器下载文件 * @Version1.0 Jul 27, 2008 5:32:36 PM by 崔红保(cuihongbao@d-heaven.com) ...

  7. android lame音频转换,音视频开发02--使用LAME库转换pcm文件到mp3

    android 使用 AudioRecord 对麦克风进行录音得到的是 pcm 格式的原始音频数据,pcm文件是不能用来播放的,需要进行编码压缩. LAME是目前非常优秀的一种MP3编码引擎,在业界, ...

  8. macos 查找文件_如何在Windows和macOS上查找和安装颜色配置文件以获取更准确的显示器...

    macos 查找文件 Color profiles, also known as ICC or ICM files, contain a collection of settings that hel ...

  9. Qt文件编码转换工具(二) C++判断文件编码

    目录 下载链接 上一节 如何判断文件编码 下一节 下载链接 Realase打包版本下载: Qt文本转化工具 realase版本 https://download.csdn.net/download/q ...

最新文章

  1. ue4商城资源 Car Configurator Template 汽车配置器模板
  2. 牛X!Github项目中文榜,你想知道不想知道的都有!
  3. Html5 History API解析
  4. java随机输出10计算题
  5. U3D中可以直接使用GL!!!
  6. Node+GitLab实现小程序CI系统
  7. MATLAB学习笔记(五)
  8. 批处理bat脚本自动配置java的jdk环境变量
  9. mysql 如何解决字段不区分大小写的问题
  10. Notepad3(高级文本编辑器)v5.19.815.2595版本更新啦
  11. Android笔记(3)使用dataBinding数据的错误啊啊啊啊啊啊啊啊!!!!
  12. MyEclipse出现弹窗提示“当前页面的脚本发生错误”
  13. js基础-语法(switch)
  14. 三次样条插值(附完整代码)
  15. 实现一个CAN通讯上位机
  16. 使用firewall-cmd限制ssh只能从指定IP段访问
  17. H5填坑笔记--持续更新
  18. JUnit version 3.8 or later expected
  19. 项目开发中引入外部字体库
  20. 关于微信HOOK协议,包括云控的后续开发经验

热门文章

  1. python 函数的定义
  2. unity 实现UIGIF效果
  3. 【转】 oracle中英文分开排序
  4. 查找5G核心网参考资料的方法
  5. 如何使用UWA做游戏性能优化
  6. matlab如何对wt积分,Matlab数值积分程序集合
  7. 输电线路状态监测装置通用技术规范即I1协议
  8. 信息系统管理工程师与项目管理师
  9. C++基础课—郑莉9-
  10. [Inno]制作类似矮人工具箱的程序/设置系统启动时间工具