2013-06-04 4 views
3

Je crée un WAV (PCM) au convertisseur MP3. Mais la sortie est trop rapide.Changements de vitesse audio sur la conversion WAV en MP3

Ceci est le code qui convertit le codage.

FILE *pcm = fopen(in_path, "rb"); 
FILE *mp3 = fopen(out_path, "wb"); 

int read, write;  

const int PCM_SIZE = 8192; 
const int MP3_SIZE = 8192; 

short int pcm_buffer[PCM_SIZE*2]; 
unsigned char mp3_buffer[MP3_SIZE]; 

lame_t lame = lame_init(); 
lame_set_in_samplerate(lame, sampleRate); 
lame_set_brate(lame, byteRate); 
lame_set_num_channels(lame, channels); 
lame_set_mode(lame, MONO); 
lame_set_VBR(lame, vbr_default); 
lame_init_params(lame); 

do { 
    read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); 
    if (read == 0) 
    { 
     write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); 
    } 
    else 
    { 
     write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); 
    } 
    fwrite(mp3_buffer, write, 1, mp3); 
} while (read != 0); 

lame_close(lame); 
fclose(mp3); 
fclose(pcm); 

Les paramètres sampleRate, byteRate et channels sont lues dans l'en-tête de WAV.

Je crois que quelque chose manque dans le code ....

Répondre

8

Vous mise en place pour encoder un flux mono (lame_set_mode(lame, MONO);) mais fournissant les données comme si elle était entrelacée stéréo.

S'il s'agit d'un flux mono, supprimez le 2* de fread pour lire suffisamment d'échantillons pour un seul canal; et appelez lame_encode_buffer plutôt que lame_encode_buffer_interleaved, avec le pointeur de canal de droite défini sur NULL ou pcm_buffer pour coder un seul canal.

S'il s'agit d'un flux stéréo, ne définissez pas le mode sur mono. Vous ne devriez probablement pas le faire de toute façon; Je pense qu'il détecte le mode basé sur le nombre de canaux.

En outre, comme je l'ai mentionné quand je wrote that code, vous devez vérifier et gérer les erreurs si vous l'utilisez dans une application réelle. C'est un exemple très basique.

+0

Merci! J'ai trouvé votre code, et change tout pour le faire fonctionner! Je pensais que régler MONO fera des œuvres. Mais maintenant je me rends compte que définir un tampon comme NULL va le réparer! – Victor

+0

Merci !!!!! vous résolvez mon problème –

1

Si vous faites affaire avec un son mono, souvenez-vous de régler le canal à 1

if (channel == 1) { 
    lame_set_num_channels(lame, 1); 
    lame_set_mode(lame, MONO); 
} 

mettre à jour également la fonction de codage

if (channel == 1) { 
    write = lame_encode_buffer(lame, pcm_buffer, NULL, read, mp3_buffer, MP3_SIZE); 
}else{ 
    write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); 
} 
+1

Comme, 3 ans plus tard, mais après avoir passé toute la nuit à essayer de résoudre ce problème, votre code l'a fait! Je vous remercie! – Echelon