Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





COMO MONTAR UN WAV EN ANSI C¡SOCORRO! No quiero +chunks....

Iniciado por Luxthor, 12 de Julio de 2006, 03:40:07 PM

« anterior - próximo »

Luxthor

Buenas a todos!

Estoy empezando con la programación (llevo tiempo programando pero no me he puesto en serio hasta ahora mismo...) y estoy intentando montar un fichero WAV·

Según toda la documentación que he recopilado de internet sobre el formato RIFF, los chunks que componen un fichero de este formato y todo lo relacionado con el tema no sólo no parece difícil sino que parece tirao· Al parecer lo único que supuestamente hay que hacer es incluir esa cabecera:

Bytes        Contenido Usual      Propósito/Descripción
00 – 03     "RIFF"                  Bloque de identificación (sin comillas)·
04 – 07     ???       Entero largo· Tamaño del fichero en bytes, incluyendo cabecera·
08 – 11     "WAVE"     Otro identificador·
12 – 15     "fmt "     Otro identificador
16 –19     16, 0, 0, 0     Tamaño de la cabecera hasta este punto·
20 – 21     1, 0     Etiqueta de formato· (Algo así como la versión del tipo de formato utilizado)·
22 – 23     1, 0     Número de canales (2 si es estéreo)·
24 – 27     ???     Frecuencia de muestreo (muestras/segundo)·
28 – 31     ???     Número medio de bytes/segundo·
32 – 33     1, 0     Alineamiento de bloque·
34 – 35     8, 0     Número de Bits por muestra (normalmente 8, 16 ó 32)·
36 – 39     "data"     Marcador que indica el comienzo de los datos de las muestras·
40 – 43     ???     Número de bytes muestreados·
resto     ???     Muestras (cuantificación uniforme)

MI PREGUNTA ES:

¿¿¿COMO CREO UN FICHERO WAV EN ANSI C? ¿Es algo tan sencillo como crearme un fichero nuevo, abrirlo para escritura (binario) y escribir lo de antes junto con las muestras???

Bueno, ya está dicho· Sólo falta que alguien me eche un cable... big_smile

(Gracias de antemano y un saludo para todos)
uxthor (el que no sabe, por eso pregunta...) :-?

synchrnzr

Probablemente funcionaría. Pero si te miras la documentación oficial, verás que el chunk "fmt" puede ser una estructura del tipo WAVEFORMATEX (como pones aquí) o WAVEFORMATEXTENSIBLE, que es más complejo, para soporte multicanal y otras cosas. O sea que el método te puede servir para escribir WAVs válidos que se puedan describir con una estructura WAVEFORMATEX, pero si en algun momento quieres leerlos deberás informarte mejor.

sync

ethernet


struct wavh
{
 char riff[4];
 uint32 size;
 char wave[4];
 char fmt[4];
 uint32 num;
 uint16 format;
 uint16 channels;
 uint32 freq;
 uint32 abps;
 uint16 blockalign;
 uint16 bitdepth;
 char data[4];
 uint32 datasize;
 
} ;

wavh wave = {
 { 'R', 'I', 'F', 'F' },
 sizeof(wave) + N_SAMPLES*2,
 { 'W', 'A', 'V', 'E' },
 { 'f', 'm', 't', ' ' },
 0x10,
 1,
 1,
 44100,
 88200,
 2,
 16,
 { 'd', 'a', 't', 'a' },
 N_SAMPLES*2
};

int main()
{
int16 *wave_data  = new int16[sizeof(wavh)+samples];
*(struct wavh*)wave_data = wave;

//rellenas los datos
...
FILE *file = fopen("sample.wav", "wb");
fwrite(wave_data, wave.size, 1, file);
fclose(file);
...
}
;

Hace poco he escrito un artículo que lo hace.

Luxthor

100.000 MILLONES DE GRACIAS synchrnzr y ethernet!

La verdad es que me estaba volviendo realmente loco con los puñeteros chunks.... :shock:

Por cierto, articulo muy interesante sync.

Gracias de nuevo! :D
uxthor (el que no sabe, por eso pregunta...) :-?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.