2012-09-10 34 views
5

Estoy usando lame para convertir un archivo WAV (extraído de un CD de audio) en MP3. El resultado de la conversión está bien, excepto que al principio del archivo hay un solo sonido de "clic". El clic tarda casi 0,5 segundos antes de la canción en sí.Haga clic en el sonido al principio cuando use Lame

char *input_file = argv[1]; 
char *output_file = argv[2]; 

FILE *pcm = fopen(input_file, "rb"); 
FILE *mp3 = fopen(output_file, "wb+"); 

size_t nread; 
int ret, nwrite; 

const int PCM_SIZE = 1152; 
const int MP3_SIZE = 1152; 

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

lame_t lame = lame_init(); 

// Can not put these lines at the end of conversion 
id3tag_set_title(lame, "Still reminds me"); 
id3tag_set_artist(lame, "Anggun"); 

lame_set_VBR(lame, vbr_mt); 
lame_set_VBR_quality(lame, 2); 

ret = lame_init_params(lame); 

do { 
    nread = fread(pcm_buffer, sizeof(short), PCM_SIZE * 2, pcm); 

    if (nread != 0) { 
     // Is this the cause of the single click? 
     int nsamples = nread/2; 
     short buffer_l[nsamples]; 
     short buffer_r[nsamples]; 

     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, nsamples, 
       mp3_buffer, MP3_SIZE); 

    } else { 
     nwrite = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); 

    } 

    fwrite(mp3_buffer, nwrite, 1, mp3); 
} while (nread != 0); 


lame_close(lame); 

fclose(mp3); 
fclose(pcm); 

¿Qué está pasando? ¿Qué extraño aquí?

Respuesta

2

¿Algún problema para resolver este problema? He estado teniendo el mismo problema.

FWIW, Intenté simplemente omitir los primeros 1024 bytes al escribir en el archivo de salida (es decir, estoy descartando esos bytes antes de comenzar a escribir la salida del cojo en el archivo de salida). Esto eliminó el 'clic' al comienzo de la grabación. Un poco de pirateo, pero parece funcionar bien.

+0

Eso es brillante. Siempre debería usar una solución orientada a resultados. Creo que usaré este truco hasta que resuelva el problema. ¡Gracias, amigo! – sancho21

6

No estoy seguro si aún está buscando una respuesta que no sea Dave L's, pero el ruido de clic proviene de una codificación accidental del encabezado en el archivo de audio. Dependiendo del archivo wav que está produciendo, el encabezado probablemente sea de 44 bytes. Me encontré con un problema similar al convertir archivos pcm que grabé, pero esos encabezados son 4096 bytes en mi caso. Si se trata de un verdadero archivo WAV (y por lo tanto tiene la cabecera de 44 bytes) sólo tiene que utilizar

fseek(pcm,44,0); 

justo después de abrir el archivo para saltar sobre el material de cabecera. También recomiendo usar un editor hexadecimal en uno de sus archivos wav para verificar el tamaño del encabezado.

Una vez que me salté eso (de nuevo, mis encabezados eran 4096b), el ruido de clic desapareció.

+0

Funciona, excepto que tengo nwrite = -1 cuando llamo a 'nwrite = lame_encode_flush (lame, mp3_buffer, MP3_SIZE); 'Fallé al enjuagar. Sin fseek, nwrite return> = 0. – sancho21

0

Omitir el encabezado es importante para evitar un clic, pero un tamaño fijo de, por ejemplo. 44 Bytes es una solución que no funciona. Mis archivos wav típicos que tienen un encabezado de 80 bytes. De todos modos, debe analizar el archivo wav para encontrar el tamaño real del encabezado. Esto también tiene sentido para tomar algunas cosas adicionales como bits por muestra, cantidad de canales, etc. que se pueden usar para establecer los parámetros correctos para lame o para proporcionar algunos parámetros predeterminados útiles.

Para facilitar las cosas, no debe desarrollar todo esto desde el principio. La interfaz incluido en las fuentes de Lame se puede utilizar (busque el archivo y get_audio.c la función parse_wave_header(lame_global_flags * gfp, FILE * sf)

Si sólo necesita el tamaño del encabezado, por supuesto puede modificar esta función para adaptarse a sus necesidades.

Cuestiones relacionadas