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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux下lamealsa进行音频流操作(四)alsa+lame将音频流转为MP3

發(fā)布時(shí)間:2023/12/16 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下lamealsa进行音频流操作(四)alsa+lame将音频流转为MP3 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.linux下使用alsa錄音成pcm文件再使用lame轉(zhuǎn)碼為MP3

#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <alsa/asoundlib.h> #include <signal.h> #include <lame/lame.h>/*PCM文件轉(zhuǎn)碼成mp3文件*/ void ConvertPCM2MP3WithPath(const char *inputPath, const char *outputPath) {size_t readSize, writeSize;/*打開(kāi)pcm文件以及mp3文件*/FILE *pcmFile = fopen(inputPath, "rb");if (!pcmFile){fprintf(stderr, "could not open %s\n", inputPath);return;}FILE *mp3File = fopen(outputPath, "wb");if (!mp3File){fprintf(stderr, "could not open %s\n", outputPath);return;}const int PCM_BUFF_SIZE = 8192;const int MP3_BUFF_SIZE = 8192;short int pcm_buffer[PCM_BUFF_SIZE * 2];unsigned char mp3_buffer[MP3_BUFF_SIZE];lame_t lame = lame_init();lame_set_in_samplerate(lame, 44100);lame_set_VBR(lame, vbr_default);lame_init_params(lame);do{readSize = fread(pcm_buffer, 2 * sizeof(short int), PCM_BUFF_SIZE, pcmFile);printf("MP3::::::::::::: readSize: %ld \n", readSize);if (readSize == 0){writeSize = lame_encode_flush(lame, mp3_buffer, MP3_BUFF_SIZE);}else{writeSize = lame_encode_buffer_interleaved(lame, pcm_buffer, (int)readSize, mp3_buffer, MP3_BUFF_SIZE);}fwrite(mp3_buffer, writeSize, 1, mp3File);} while (readSize != 0);lame_close(lame);fclose(mp3File);fclose(pcmFile); }static int recording; /*CTL+C 取消錄音*/ void stop_recording(int param) {recording = 0; }/*開(kāi)始錄音*/ int StartRecode(const char *PcmFile) {FILE *pFile;pFile = fopen(PcmFile, "wb");if (pFile == NULL){printf("open Pcmdfile err!\n");return -1;}int rc;int size;snd_pcm_t *handle;snd_pcm_hw_params_t *params;unsigned int val;int dir;snd_pcm_uframes_t frames;char *buffer;/*打開(kāi)PCM capture捕捉設(shè)備*/rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0);if (rc < 0){printf("can't open pcm devecie\n");exit(1);}/*分配一個(gè)硬件參數(shù)結(jié)構(gòu)體*/snd_pcm_hw_params_alloca(&params);/*使用默認(rèn)參數(shù)*/snd_pcm_hw_params_any(handle, params);/*Interleaved mode*/snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);/*設(shè)置16小端采樣精度*/snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);/*雙通道*/snd_pcm_hw_params_set_channels(handle, params, 2);/*采樣率44100 CD級(jí)別音質(zhì)*/val = 44100;snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);/*一個(gè)周期32幀*/frames = 32;snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);/*參數(shù)生效*/rc = snd_pcm_hw_params(handle, params);if (rc < 0){printf("can't set hw params\n");exit(0);}/*得到一個(gè)周期的數(shù)據(jù)大小*/snd_pcm_hw_params_get_period_size(params, &frames, &dir);/* 16位采樣精度 所以要*4*/size = frames * 4;buffer = (char *)malloc(size);if (buffer == NULL){printf("malloc buffer size err!\n");return -2;}recording = 1;while (recording){/*捕捉數(shù)據(jù)*/rc = snd_pcm_readi(handle, buffer, frames);if (rc == -EPIPE){printf("over run occured\n");snd_pcm_prepare(handle);}else if (rc < 0){printf("err from read!\n");}else if (rc != (int)frames){printf("short read frames\n");}rc = fwrite(buffer, sizeof(char), size, pFile);if (rc != size){printf("short write %d bytes\n", rc);}if (signal(SIGINT, stop_recording) == SIG_ERR){printf("signal failed\n");}}/*關(guān)閉文件句柄*/snd_pcm_drain(handle);snd_pcm_close(handle);free(buffer);fclose(pFile); }int main(int argc, char *argv[]) {StartRecode("test.pcm");ConvertPCM2MP3WithPath("test.pcm", "Goal.mp3");const char *cmd = "rm -f test.pcm";system(cmd);return 0; }

編譯成可執(zhí)行文件
gcc RecodePcm2Mp3.c -lasound -lmp3lame

2.linux下使用alsa收集音頻流使用lame直接保存為MP3

代碼1:

/*============================================================================= # FileName: pcm_encoder_mp3.c # Desc: use lame encode pcm data to mp3 format, the pcm data # read from alsa # Author: licaibiao # LastChange: 2017-03-27 =============================================================================*/ #define ALSA_PCM_NEW_HW_PARAMS_API #include <alsa/asoundlib.h> #include <stdio.h> #include <stdlib.h> #include <lame/lame.h> #define INBUFSIZE 128 #define MP3BUFSIZE (int) (1.25 * INBUFSIZE) + 7200lame_global_flags *gfp; short *input_buffer; char *mp3_buffer; char *outPath = "out.mp3"; FILE *infp; FILE *outfp;snd_pcm_hw_params_t *params; snd_pcm_uframes_t frames; snd_pcm_t *handle; int size; short *alsa_buffer;void lame_init_set(void) {int ret_code;gfp = lame_init();if (gfp == NULL) {printf("lame_init failed/n");}ret_code = lame_init_params(gfp);if (ret_code < 0){printf("lame_init_params returned %d/n",ret_code);}outfp = fopen(outPath, "wb"); }void lame_alloc_buffer(void) {input_buffer = (short*)malloc(INBUFSIZE*2);mp3_buffer = (char*)malloc(MP3BUFSIZE); }void lame_release(void) {free(mp3_buffer);free(input_buffer);fclose(outfp);lame_close(gfp); }void alsa_init(void){unsigned int val;int dir;int ret;ret = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0);if (ret < 0) {fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(ret));exit(1);}snd_pcm_hw_params_alloca(?ms);snd_pcm_hw_params_any(handle, params);snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);snd_pcm_hw_params_set_channels(handle, params, 2);val = 44100;snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);frames = 32;snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);ret = snd_pcm_hw_params(handle, params);if (ret < 0) {fprintf(stderr,"unable to set hw parameters: %s\n", snd_strerror(ret));exit(1);} }void alsa_alloc_buffer(void){int dir;snd_pcm_hw_params_get_period_size(params, &frames, &dir);size = frames * 4; alsa_buffer = (short *) malloc(size);}void alsa_release(void){snd_pcm_drain(handle);snd_pcm_close(handle);free(alsa_buffer); } void lame_encode(void) {int input_samples;int mp3_bytes;int status = 0;int ret = 0;int loop = 10000;while(loop--){ret = snd_pcm_readi(handle, alsa_buffer, frames);if (ret == -EPIPE){fprintf(stderr, "overrun occurred\n");snd_pcm_prepare(handle);}else if(ret == -EBADFD){printf("PCM is not in the right state \n");}else if(ret == -ESTRPIPE){printf("stream is suspended and waiting for an application recovery \n");}else if (ret < 0){fprintf(stderr, "error from read: %s\n",snd_strerror(ret));}else if (ret != (int)frames){fprintf(stderr, "short read, read %d frames\n", ret);}else if (ret == 0){printf(" pcm read 0 frame deta \n ");}memcpy(input_buffer, alsa_buffer, size);mp3_bytes = lame_encode_buffer_interleaved(gfp, input_buffer, size/4, mp3_buffer, MP3BUFSIZE);if (mp3_bytes < 0) {printf("lame_encode_buffer_interleaved returned %d \n", mp3_bytes);} else if(mp3_bytes > 0) {fwrite(mp3_buffer, 1, mp3_bytes, outfp);}}mp3_bytes = lame_encode_flush(gfp, mp3_buffer, sizeof(mp3_buffer));if (mp3_bytes > 0) {printf("writing %d mp3 bytes\n", mp3_bytes);fwrite(mp3_buffer, 1, mp3_bytes, outfp);} }int main(int argc, char** argv) {lame_init_set();lame_alloc_buffer();alsa_init();alsa_alloc_buffer();lame_encode();lame_release();alsa_release(); }

代碼2:
https://github.com/RichardoMrMu/alsa_lame_pcm_2_mp3?organization=RichardoMrMu&organization=RichardoMrMu

總結(jié)

以上是生活随笔為你收集整理的linux下lamealsa进行音频流操作(四)alsa+lame将音频流转为MP3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久久久久免费观看 | 欧美少妇视频 | 一级黄色片网址 | 91.久久| 精国产品一区二区三区a片 国产精品第一 | 久久网中文字幕 | 熟妇高潮一区二区三区在线播放 | 操操操干干干 | 欧美a在线视频 | 人妻少妇精品无码专区久久 | 天天弄天天操 | 国产精品人人妻人人爽人人牛 | 91精品综合久久久久久五月天 | 日本免费a视频 | 第一次破处视频 | 国产精品自拍网 | 天天操一操| 亚洲精品视频一二三区 | 日韩精品久久久久久久的张开腿让 | 久久国产精品视频 | 久久久久久久亚洲av无码 | 日本中文有码 | 国产美女无遮挡永久免费观看 | 人人狠狠| 黄色动漫在线观看 | 精品人妻少妇AV无码专区 | 欧美精品久久久 | 邻居少妇张开腿让我爽了在线观看 | 在线观看欧美一区二区 | 日本亚洲高清 | 99re视频 | 少妇高潮av久久久久久 | 女生张开腿给男生桶 | 亚洲第七页 | 国产chinese男男网站大全 | 18视频在线观看娇喘 | 国内一区二区 | www.九色.com| 久久99久久99精品免观看软件 | 国产精品一线天 | 日韩欧美一区二区在线观看 | 狠狠撸视频| 国产91在线免费 | 国产污污在线观看 | 99欧美精品 | 91午夜在线观看 | 免费处女在线破视频 | 国产1区2区3区中文字幕 | 人妻巨大乳一二三区 | 操操操操操操操 | 欧美xxxx69| 中文在线第一页 | 91亚洲精华国产精华精华液 | 日韩av在线网 | 欧美成人精品一区二区 | 日韩精品免费一区二区 | 尤物精品在线观看 | 一区二区三区四区精品视频 | 欧美在线观看免费高清 | av导航在线 | 天堂网在线观看视频 | 成人激情在线视频 | 国产欧美啪啪 | 国产有码视频 | 香蕉久草| 日本免费一区二区三区四区五六区 | av观看一区 | 日韩爱爱网 | 瑟瑟久久 | 国产黄色免费在线观看 | jizz91 | 国产福利视频在线观看 | av调教 | 久久yy| 中文字幕综合 | 大度亲吻原声视频在线观看 | 黄色av大全 | 国产女人高潮时对白 | 精品自拍视频 | 大又大粗又爽又黄少妇毛片 | 四虎精品在永久在线观看 | 色播av| 日本一区二区视频在线播放 | 一级片美女 | 99re这里只有| 老司机激情视频 | 手机看片福利视频 | 欧美特一级片 | 日韩精品美女 | 在线观看日本 | 中文字幕一区二区三区免费看 | 国产性猛交╳xxx乱大交一区 | 久久久久久成人精品 | 97超在线| 国产精品99一区 | 辟里啪啦国语版免费观看 | 女尊高h男高潮呻吟 | 国产精品hd | 一区二区三区日 |