日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

macos上使用lame将pcm文件编码为mp3不使用ide

發布時間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 macos上使用lame将pcm文件编码为mp3不使用ide 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。