macos上使用lame将pcm文件编码为mp3不使用ide
1 內(nèi)容介紹
1,本文主要介紹如何使用lame庫,將pcm文件編碼為mp3文件,不使用ide.
2,環(huán)境為macos.各個環(huán)境的代碼都是一樣的,主要是編譯庫的腳本不一樣.
3,打算寫一個整合了ios,android,centos,windows,macos上的編譯腳本,發(fā)布為另一篇文章.
2 編譯lame庫
1,編譯lame庫的腳本,將在整理之后發(fā)布出來.
2,暫時可以先下載已經(jīng)編譯好的版本,for macos!
https://pan.baidu.com/s/11wyA7QuYuB6YUd-FyqYgcg?pwd=j0f93 編寫源代碼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[]) {//輸入?yún)?shù).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大小的數(shù)據(jù).int bufferSize = 1024 * 256;//一個short是2個字節(jié).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個字節(jié)的數(shù)據(jù)==讀一個bufferSize的數(shù)據(jù).// 每次讀一個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,沒有指定輸出文件名,默認的輸出結(jié)果為a.out
5 運行
./a.out timeless.pcm timeless.mp31,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 總結(jié)
1,timeless.mp3,是小編最喜歡的歌曲之一,時間是最寶貴的財富,希望我們都能珍惜當下.
2,這個系列好久之前就想寫了,拖了好久.
總結(jié)
以上是生活随笔為你收集整理的macos上使用lame将pcm文件编码为mp3不使用ide的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恢复服务器上的安装器信息已被破坏_Gar
- 下一篇: PD3.0详解 第十二章总结