|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
[C] File audio WAV: devo leggerne l'Header x saperne la lunghezza in tempo?!
... ho dei file WAV da utilizzare, ma devo usare il C per capire quanti secondi/minuti/ore/ecc ... durano in modo da impiegarli nel modo migliore.
Qualcuno lo ha già fatto per caso?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Utilizzare qualcosa tipo questo:
Codice:
/* *********************************************
controllo che il file sia un file WAV in "Canonical Wave Format"
leggo i primi 12 bytes in cui c'e' il primo header di tipo RIFF */
if(*plenfile<12) {
fprintf(stderr, "lunghezza file troppo piccola, non c'e' il primo
header\n");
fclose(f);
return(0);
}
ris=fread(buf,1,12,f);
if(ris<12) {
fprintf(stderr, "letti solo %d byte invece di 12\ntermino\n", ris);
fclose(f);
return(0);
}
/* nei primi 4 byte ci deve essere "RIFF" */
ris=strncmp(buf,"RIFF",4);
if(ris!=0) {
fprintf(stderr, "il primo campo del file non e' RIFF, non e' un file
WAV\ntermino\n");
fclose(f);
return(0);
}
/* nei byte dal 5 all 8 ci deve essere la lunghezza totale del file */
filelendentroilfile=littleendian32bit2littleendian(buf+4);
fprintf(stderr, "filelendentroilfile %ld\n", filelendentroilfile);
if(filelendentroilfile!=*plenfile) {
fprintf(stderr, "WARNING: filelendentroilfile=%ld != *plenfile=%ld
\n", filelendentroilfile, *plenfile );
fprintf(stderr, "ma continuo lo stesso\n" );
/*
fclose(f);
return(0);
*/
}
/* nei byte dal 9 al 12 ci deve essere "WAVE" */
ris=strncmp(buf+8,"WAVE",4);
if(ris!=0) {
fprintf(stderr, "il terzo campo del file non e' WAVE, non e' un file
WAV\ntermino\n");
fclose(f);
return(0);
}
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
io non ho mai gestito il formato WAV, ma per i file formats wotsit.org è la fonte: http://www.wotsit.org/list.asp?search=wav&button=GO%21
ciao edit: questo link dovrebbe fare al caso tuo: http://www.wotsit.org/getfile.asp?fi...e&sc=232612309 |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
http://msdn2.microsoft.com/en-us/library/ms713497.aspx ciao |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
OK, grazie.
Adesso vedo se ci capisco qualcosa. Ma voi non utilizzate mai: http://www.google.com/codesearch?hl=it ?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
O_O
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Si, x cercare codice da riutilizzare o vedere gli altri come fanno le cose tanto per migliorarsi o 1000 altri usi.
Insomma: è inutile reinventare la ruota. NO?
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
Quote:
io di solito scarico i sorgenti che possono interessarmi e uso cscope, ma così si fa più in fretta |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Quindi sbizzarritevi ad aiutarmi plz:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Tra l'altro da tutti questi link sembra non uscire un campo di TOT bytes per indicare il tempo. Come lo ricavo?! Io pensavo che data la frequenza di campionamento costante si potesse tentare qualcosa del tipo: frequenza di campionamento * numero di campioni?! Con un MP3 la vita sarebbe + semplice?! C'è 1 campo esplicito x la lunghezza del file audio?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 22-05-2007 alle 21:59. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
O almeno trovare un programma che posso lanciare con la funzione "System(STRINGA DI COMANDO)" che mi possa restituire come risultato la lunghezza del file audio.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
certo che c'è: // TimeWav=Lunghezzafile/W.persec; //controllo bit if(W.wBitsPerSample==16) TimeWav=TimeWav/2; //numero canali TimeWav=TimeWav/W.Canali; forse se guardi il link sopra capiresti meglio... |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Mi son fatto anche 1 raccolta di quello che ho trovato: LINK della raccolta. Ma tu a quale link in particolare stai facendo riferimento?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 22-05-2007 alle 22:23. |
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ops, è vero: il link è divenuto invalido subito dopo che io ho chiuso il browser, si vede che era correlato alla ricerca che ho fatto. comunque non ho fatto nulla di chè: ho solo cercato "WAV" su wotsit.org.
Quote:
dovresti fare 4 / 2, cioè numero di campioni / frequenza (intesa come campioni al secondo). |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Io leggendo: , mi sono fatto questa idea del file wave:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Per una migliore soluzione del problema ho incrociato le informazioni:
HELP: devo leggere la lunghezza di files audio WAV con un programmino in C. ... per il ricavo della lunghezza del file audio (in secondi) attraverso algoritmo. Questo nel qualcaso non riusci a identificare ed ad accedere al fantasmagorico "campo" TimeWav. [EDIT] Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 30-05-2007 alle 16:03. |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
#include <mmsystem.h> apertura file: HMMIO hmmio; MMCKINFO mmckinfoParent; MMCKINFO mmckinfoSubchunk; /* Apertura file*/ if ((hmmio = mmioOpen(&WaveName[0], 0, MMIO_READ|MMIO_ALLOCBUF))) { /* prendi la lunghezza */ WaveDataSize = mmckinfoSubchunk.cksize; /* chiudi il file */ mmioClose(hmmio, 0); } printf WaveDataSize ciao |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Un pò di riferimenti alla struttura degli Wav
http://www.sonicspot.com/guide/wavefiles.html http://ccrma.stanford.edu/courses/42...cts/WaveFormat Devi andare a trovare il Chunk chiamato 'data' e prendere i 4 byte successivi. A me però risulta che il campo "datasize" sia in big endian (verificabile aprendo un file wave con un editor esadecimale) |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Ecco quì:
Codice HTML:
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <conio.h> #include <mmsystem.h> #include <malloc.h> #include <tchar.h> #include <stdlib.h> TCHAR WaveName[] = "stereo.wav"; WAVEFORMATEX WaveFormat; DWORD WaveDataSize; int _tmain(int argc, _TCHAR* argv[]) { HMMIO hmmio; MMCKINFO mmckinfoParent; MMCKINFO mmckinfoSubchunk; //prima intestazione if ((hmmio = mmioOpen(&WaveName[0], 0, MMIO_READ|MMIO_ALLOCBUF))) { mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioDescend(hmmio, (LPMMCKINFO)&mmckinfoParent, 0, MMIO_FINDRIFF)) { return(-2); } ...code WaveDataSize = mmckinfoSubchunk.cksize; printf("Wave size = %u\n", WaveDataSize); mmioClose(hmmio, 0); system("pause"); return(0); } return(-1); } Ultima modifica di okay : 26-05-2007 alle 08:35. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:31.




















