Как использовать LAME API в C? Есть какой-нибудь простой пример?

Есть ли простой пример (с пояснениями) того, как использовать LAME API в C? Мне удалось использовать следующий код (на основе Есть ли LAME c ++ обертка \ упрощение (работающая на Linux Mac и Win из чистого кода)?):

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. Если мне нужно использовать первый способ, как использовать такой pcm_buffer в Java? Я хочу использовать JNI

  3. Это правильный способ получить 2 буфера (левый и правый)?

Спасибо


person sancho21    schedule 14.07.2012    source источник
comment
Я не знаю LAME, но ответ на ваш первый вопрос заключается в том, что доступно PCM_SIZE * 2 * sizeof(short) байта памяти. Первый метод так много читает. Ваш метод читает половину.   -  person Shahbaz    schedule 14.07.2012
comment
Только что обновил свой вопрос. Фрагмент кода здесь не подходит.   -  person sancho21    schedule 14.07.2012


Ответы (1)


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) байтов в буфере.

person Michael    schedule 14.07.2012
comment
Но, насколько мне известно, второй аргумент fread сообщает нам, что он прочитает 2 байта (2 * sizeof short) и поместит их в short (для чего выделено 2 * PCM_SIZE шорт). Как это может быть возможно поместить 2 байта в один байт (это как присвоение коротких a = двухбайтовых данных). - person sancho21; 14.07.2012
comment
Второй аргумент указывает размер каждого читаемого элемента, то есть 4 байта (при условии, что в вашей целевой системе короткий составляет 2 байта). Третий аргумент указывает, сколько таких элементов следует прочитать. Таким образом, в целом код заполняет весь буфер каждым чтением. - person Michael; 14.07.2012