gpt4 book ai didi

c - 如何在C中使用LAME API?有没有简单的例子?

转载 作者:行者123 更新时间:2023-11-30 17:59:23 26 4
gpt4 key购买 nike

有没有关于如何在 C 中使用 LAME API 的简单示例(带解释)?我确实设法使用以下代码(基于 Is there any LAME c++ wraper\simplifier (working on Linux Mac and Win from pure code)? ):

FILE *pcm = fopen(input_file, "rb");
FILE *mp3 = fopen(output_file, "wb");
size_t nread;
int ret, nwrite;

// 1. Get lame version (OPTIONAL)
printf("Using LAME v%s\n", get_lame_version());

const int PCM_SIZE = 8192;
const int MP3_SIZE = 8192;

short pcm_buffer[PCM_SIZE * 2];
unsigned char mp3_buffer[MP3_SIZE];

// 2. Initializing
lame_t lame = lame_init();

// 3. Do some settings (OPTIONAL)
// lame_set_in_samplerate(lame, 48000);
lame_set_VBR(lame, vbr_default);
// lame_set_VBR_quality(lame, 2);

// 4. Initialize parameters
ret = lame_init_params(lame);
if (ret < 0) {
printf("Error occurred during parameters initializing. Code = %d\n",
ret);
return 1;
}

do {
// Read PCM_SIZE of array
nread = fread(pcm_buffer, 2 * sizeof(short), PCM_SIZE, pcm);
if (nread != 0) {
// 5. Encode
int nsamples = nread;
short buffer_l[nsamples];
short buffer_r[nsamples];

printf("nread = %d\n", nread);
printf("pcm_buffer.length = %d\n", sizeof(pcm_buffer)/sizeof(short));

int j = 0;
int i = 0;
for (i = 0; i < nsamples; i++) {
buffer_l[i] = pcm_buffer[j++];
buffer_r[i] = pcm_buffer[j++];

}

nwrite = lame_encode_buffer(lame, buffer_l, buffer_r, nread,
mp3_buffer, MP3_SIZE);
} else {
// 6. Flush and give some final frames
nwrite = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
}

if (nwrite < 0) {
printf("Error occurred during encoding. Code = %d\n", nwrite);
return 1;
}

fwrite(mp3_buffer, nwrite, 1, mp3);
} while (nread != 0);

// 7. Write INFO tag (OPTIONAL)
// lame_mp3_tags_fid(lame, mp3);

// 8. Free internal data structures
lame_close(lame);

fclose(mp3);
fclose(pcm);

但问题是,

  1. 我不明白为什么要使用

    short pcm_buffer[PCM_SIZE * 2];
    fread(pcm_buffer, 2 * sizeof(short), PCM_SIZE, pcm);

    而不是

    short pcm_buffer[PCM_SIZE * 2];
    fread(pcm_buffer, sizeof(short), PCM_SIZE * 2, pcm);
  2. 如果我必须使用第一种方式,如何在Java中使用获取这样的pcm_buffer?我想使用JNI

  3. 这是获取 2 个缓冲区(左和右)的正确方法吗?

谢谢

最佳答案

1) I don't understand why use

pcm_buffer 具有可容纳 PCM_SIZE*2 元素的空间,每个元素的大小为 sizeof(short) 字节(通常为 2 字节)。 IE。总共 PCM_SIZE*2*sizeof(short) 字节。

这就是为什么 fread 正在读取 2*sizeof(short)PCM_SIZE block ,它填满了整个 PCM_SIZE*缓冲区中的 2*sizeof(short) 字节。

关于c - 如何在C中使用LAME API?有没有简单的例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com