IOS lame库 pcm转mp3 分析(方案一)

方案一:使用 AVAudioRecorder 录制pcm数据格式文件,然后启动子线程循环遍历文件,读取pcm数据转码mp3并写入mp3文件(目前网上资料大多是这样)

1.lame初始化 & 打开pcm、mp3文件 获取文件指针

单通道无需设置lame_set_model,因为api已经说明  default: lame picks based on compression ration and input channels(根据brate和channels默认设置)

扩展能力:写入文件头信息 例如 id3tag_set_artist ===》作者, 头信息设置必须在 lame_init_param()之前

扩展能力:写入封面图(image)id3tag_set_albumart 

打开文件获取文件指针(指向字节位置)

 

2.遍历pcm文件,获取字节数据,转码,写入mp3文件

const int PCM_SIZE = 8192; // 相当于8192箱啤酒,一箱16瓶(啤酒=字节,8192个16字节的数据长度)

short int pcm_buffer[PCM_SIZE * self.realChannels]; // 填充 多少个pcm格式数据元素的数组

do{}while() 循环读取pcm文件,判断字节数是否大于设定的标准

 

 

 

 

跳过开头 fseek(pcm, 4 * 1024, SEEK_CUR);  过滤噪音

 

条件成熟,开始读取pcm文件数据并存入pcm_buffer中(文件指针会偏移到读取字节的末尾位置)

 

 

将pcm_buffer中的数据转码成mp3格式数据并放入mp3_buffer中, 区分单&双通道

 

 

需要注意write 有可能异常,正如api中所说

 

把mp3_buffer中的数据写入mp3文件中

 

 

while条件不符合的时候,跳出,仍要考虑不够标准的剩余的字节数据,也要转码并写入mp3文件

 

最后关闭文件 

 

 

转载于:https://www.cnblogs.com/madaha/p/9570556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C语言实现LAME PCMMP3,你需要使用LAME编码器的编程接口。以下是一些步骤: 1. 下载LAME编码器并安装。 2. 在你的C程序中包含LAME编码器的头文件和文件。 ``` #include "lame.h" ``` 在编译时需要链接LAME编码器的文件,例如在gcc下链接: ``` gcc -o pcm2mp3 pcm2mp3.c -lmp3lame ``` 3. 在程序中初始化LAME编码器。 ``` lame_t lame = lame_init(); lame_set_in_samplerate(lame, 44100); // 输入PCM采样率 lame_set_VBR(lame, vbr_default); // 使用默认的可变比特率 lame_init_params(lame); // 初始化LAME编码器参数 ``` 4. 打开输入文件和输出文件。 ``` FILE *pcm_file = fopen("input.pcm", "rb"); FILE *mp3_file = fopen("output.mp3", "wb"); ``` 5. 读取输入文件中的PCM数据,并将其换为MP3格式,然后写入输出文件中。 ``` short pcm_buffer[PCM_BUFFER_SIZE]; unsigned char mp3_buffer[MP3_BUFFER_SIZE]; int read, write; do { read = fread(pcm_buffer, sizeof(short), PCM_BUFFER_SIZE, pcm_file); if (read == 0) write = lame_encode_flush(lame, mp3_buffer, MP3_BUFFER_SIZE); else write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_BUFFER_SIZE); fwrite(mp3_buffer, sizeof(unsigned char), write, mp3_file); } while (read != 0); ``` 这里的PCM_BUFFER_SIZE和MP3_BUFFER_SIZE是你自己定义的缓冲区大小,可以根据需要进行调整。 6. 关闭文件和LAME编码器。 ``` fclose(pcm_file); fclose(mp3_file); lame_close(lame); ``` 完整的代码示例: ``` #include <stdio.h> #include "lame.h" #define PCM_BUFFER_SIZE 8192 #define MP3_BUFFER_SIZE 8192 int main() { lame_t lame = lame_init(); lame_set_in_samplerate(lame, 44100); // 输入PCM采样率 lame_set_VBR(lame, vbr_default); // 使用默认的可变比特率 lame_init_params(lame); // 初始化LAME编码器参数 FILE *pcm_file = fopen("input.pcm", "rb"); FILE *mp3_file = fopen("output.mp3", "wb"); short pcm_buffer[PCM_BUFFER_SIZE]; unsigned char mp3_buffer[MP3_BUFFER_SIZE]; int read, write; do { read = fread(pcm_buffer, sizeof(short), PCM_BUFFER_SIZE, pcm_file); if (read == 0) write = lame_encode_flush(lame, mp3_buffer, MP3_BUFFER_SIZE); else write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_BUFFER_SIZE); fwrite(mp3_buffer, sizeof(unsigned char), write, mp3_file); } while (read != 0); fclose(pcm_file); fclose(mp3_file); lame_close(lame); return 0; } ``` 注意事项: 1. 输入文件必须为16位的PCM数据,采样率、声道数等参数需要与LAME编码器初始化时设置的参数一致。 2. 输出文件是压缩后的MP3格式数据,可以使用任何支持MP3格式的播放器进行播放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值