是否有任何簡單的例子(與解釋)如何在C中使用LAME API?我還是設法使用下面的代碼(基於Is there any LAME c++ wraper\simplifier (working on Linux Mac and Win from pure code)?):如何在C中使用LAME API?有沒有簡單的例子?
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);
但事實是,
我不明白爲什麼要用
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);
如果我必須用第一種方式,在Java中如何使用這樣的pcm_buffer?我想使用JNI
這是一個正確的方式來獲得2緩衝區(左和右)?
由於
我不知道LAME,但你的第一個問題的答案是存在'PCM_SIZE * 2 * sizeof(short)'字節的可用內存。第一種方法讀取那麼多。你的方法讀取一半。 – Shahbaz 2012-07-14 16:44:43
剛剛更新了我的問題。代碼片段不適合這裏。 – sancho21 2012-07-14 17:19:31