2012-07-14 34 views
0

是否有任何簡單的例子(與解釋)如何在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); 

但事實是,

  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緩衝區(左和右)?

由於

+0

我不知道LAME,但你的第一個問題的答案是存在'PCM_SIZE * 2 * sizeof(short)'字節的可用內存。第一種方法讀取那麼多。你的方法讀取一半。 – Shahbaz 2012-07-14 16:44:43

+0

剛剛更新了我的問題。代碼片段不適合這裏。 – sancho21 2012-07-14 17:19:31

回答

0

1)I不明白爲什麼使用

pcm_buffer具有用於PCM_SIZE*2元素各自爲sizeof(short)字節大(通常爲2個字節)的空間。即總共有PCM_SIZE*2*sizeof(short)字節。

這就是爲什麼fread正在讀取PCM_SIZE塊的2*sizeof(short),它填滿了緩衝區中的整個PCM_SIZE*2*sizeof(short)字節。

+0

但據我所知,fread第二個參數告訴我們它會讀取2個字節(2 * sizeof short)並將其放在一個短的(其中有2 * PCM_SIZE的短路分配)。如何才能將2個字節放入單個字節(就像分配short a = 2個字節的數據一樣)。 – sancho21 2012-07-14 17:05:18

+0

第二個參數指定要讀取的每個元素的大小,即4個字節(假設目標系統中的短小爲2個字節)。第三個參數指定應該讀取多少個這樣的元素。因此,所有的代碼都在填充每個fread的整個緩衝區。 – Michael 2012-07-14 17:21:12

相關問題