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

时间:2012-07-14 16:31:11

标签: c java-native-interface lame

是否有任何关于如何在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个缓冲区(左和右)的正确方法吗?

  4. 由于

1 个答案:

答案 0 :(得分:0)

  

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

pcm_buffer具有PCM_SIZE*2个元素的空间,每个元素的sizeof(short)字节都很大(通常为2个字节)。即总共PCM_SIZE*2*sizeof(short)个字节。

这就是fread正在阅读PCM_SIZE 2*sizeof(short)块的原因,它正在填充缓冲区中的整个PCM_SIZE*2*sizeof(short)字节。