【问题标题】:How to use LAME API in C? Is there any simple example?如何在 C 中使用 LAME API?有没有简单的例子?
【发布时间】:2012-07-14 16:31:10
【问题描述】:

有没有什么简单的例子(有解释)说明如何在 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中使用get这样的pcm_buffer?我想使用 JNI

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

谢谢

【问题讨论】:

  • 我不知道 LAME,但您的第一个问题的答案是有 PCM_SIZE * 2 * sizeof(short) 字节的可用内存。第一种方法读了那么多。你的方法读取了一半。
  • 刚刚更新了我的问题。代码 sn-p 不适合这里。

标签: c java-native-interface lame


【解决方案1】:

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

pcm_buffer 为PCM_SIZE*2 元素提供空间,每个元素都为sizeof(short) 字节大(通常为2 字节)。 IE。 PCM_SIZE*2*sizeof(short) 字节总数。

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

【讨论】:

  • 但据我所知, fread 第二个参数告诉我们它将读取 2 个字节(2 * sizeof short)并将其放入 short 中(分配了 2*PCM_SIZE 的 short) .怎么可能将 2 个字节放入一个字节中(这就像分配 short a = 两个字节数据)。
  • 第二个参数指定要读取的每个元素的大小,即 4 个字节(假设目标系统上的 short 是 2 个字节)。第三个参数指定应该读取多少个这样的元素。所以总而言之,代码是用每个 fread 填满整个缓冲区。
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2014-01-14
  • 2010-11-03
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多