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. 《一个程序员的奋斗史》正式上架~
  2. 实时远程医学影像服务质量保障与网络优化
  3. 解决办法在安装完Nginx后服务启动失败
  4. 操作系统核心原理-5.内存管理(下):段式内存管理
  5. 基本上,把switch,用设计模式代替,肯定是bug和过度设计。想想,本来修改一个文件几行代码可以解决的问题,变成修改3-6个类才能实现一样的功能。不是傻是什么?...
  6. C语言 memcpy_s 函数 - C语言零基础入门教程
  7. 四个DBHelper实现
  8. iOS 逆向 越狱 砸壳 获取
  9. Hadoop 与 HBase 版本对应
  10. codesys 简单案例_CODESYS在智能生产线中的应用案例
  11. Partial Adversarial Domain Adaptation学习笔记
  12. Objective-C 【对象-多文件开发简介】
  13. 如何让虚拟机中乌版图系统变大?
  14. jquery下载所有版本(实时更新)
  15. java实训报告心得体会,深度好文
  16. 有关推挽输出、开漏输出、复用开漏输出、复用推挽输出
  17. C 语言字符数组的定义与初始化
  18. 从明日方舟入手数据统计--盒须图
  19. 【活动】高效学习方法分享
  20. UIUC罗宇男:AI-assisted Scientific Discovery

热门文章

  1. Java资源大全中文版(转)
  2. Use Case 用例图
  3. 试编写在带头结点的单链表1中删除一个最小值结点的高效算法(假设最小值结点是唯一的)
  4. 知识大爆炸时代的解决方案
  5. 预答辩主要提出了以下几点
  6. 任务6:认知ATmega168PA最小工作系统
  7. SPWM算法仿真搭建
  8. excel if 判读单元格如果为空就不参与计算
  9. 像CTO一样思考:如何高效管理30人的研发团队?
  10. Python 爬虫,推荐一款简单的抓包工具(续)