|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
[C] File audio MP3: devo leggerne l'Header x saperne la lunghezza in tempo?!
Ebbene 1 mio incubo è diventato realtà!
![]() Devo derminare anche per gli MP3 e gli AVI la rispettiva lunghezza in tempo. ![]() Praticamente questo 3D potrebbe essere considerato il gemello di quest'altro, o la sua continuazione: [C] File audio WAV: devo leggerne l'Header x saperne la lunghezza in tempo?! Spero che si possano poi mettere in rilievo x tutti gli altri utenti a venire. Intanto inizio a Goglare x vedere cosa trovo, inizialmente avevo anche pensato di trasformare il file MP3 in WAV, ma adesso vedo se ci sono altre strade. ![]()
__________________
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
|
Mooolto improbabile, ma magari esiste una qualche libreria unica o per ogni tipo del MIME possibile:
[RSS/ATOM] Gli enclosure video, di che tipo possono essere?! [EDIT] Info trovate su questo forum da tenere da conto: C# Riprodurre Mp3 [C#]File mp3 c++ e mp3 [C][libreria almp3 di allegro] Strano problema...
__________________
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 : 13-06-2007 alle 13:35. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
La soluzione che ho pensato io è di usare le funzioni MCI (Media Control Interface) di Windows.
Con MCI è possibile gestire qualunque audio/video a patto di avere l'apposito codec. A partire da Windows 2000 il codec per MP3 c'è. Ho scritto questo sorgente di prova, non è il massimo come struttura e gestione degli errori ma è una buona base di partenza. Codice:
#define STRICT #include <windows.h> #include <stdio.h> int main (int argc, char *argv[]) { MCIERROR mciErr; MCI_OPEN_PARMS mciOpen; MCI_SET_PARMS mciSet; MCI_STATUS_PARMS mciStatus; MCI_GENERIC_PARMS mciGen; if (argc == 2) { mciOpen.dwCallback = (DWORD_PTR) NULL; mciOpen.lpstrDeviceType = (char*) MCI_ALL_DEVICE_ID; mciOpen.lpstrElementName = argv[1]; mciOpen.lpstrAlias = NULL; if ((mciErr = mciSendCommand ((MCIDEVICEID) NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD) &mciOpen)) == 0) { mciSet.dwCallback = (DWORD_PTR) NULL; mciSet.dwTimeFormat = MCI_FORMAT_MILLISECONDS; if ((mciErr = mciSendCommand (mciOpen.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT | MCI_WAIT, (DWORD) &mciSet)) == 0) { mciStatus.dwCallback = (DWORD_PTR) NULL; mciStatus.dwItem = MCI_STATUS_LENGTH; if ((mciErr = mciSendCommand (mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD) &mciStatus)) == 0) { printf ("Lunghezza: %lu millisecondi\n", mciStatus.dwReturn); } } mciGen.dwCallback = (DWORD_PTR) NULL; mciErr = mciSendCommand (mciOpen.wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) &mciGen); } } return 0; } 1) Linkare con la libreria winmm.lib. 2) Ho provato con un file .AVI e funziona. Non ho potuto provare .WAV e .MP3 perché sono in ufficio e non ho la scheda audio. ![]() ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
I get it!
Adesso spesa lampo sotto casa e stasera lo provo. TNX. ![]()
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Provato adesso a casa con .wav, .mid (MIDI), .mov (QuickTime) e .mp3. Funziona benone.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Se funziona allora per la miseriaccia, qui ti sei superato, con meno codice si fa D+! Queste librerie MCI devono essere di fatto superiori alle Windows' MultiMedia (File) I/O (MMIO), ovvero "mmsystem.h". Tra l'altro sono tutte incluse nello stesso windows.h. Per completezza: MCI su MSDN Con MCI si può gestire qualunque formato audio-video a patto di avere un apposito CoDec. A partire da Win2k il CoDec per MP3 ad esempio c'è nel SO. ed il POST gemello: [C] File audio WAV: devo leggerne l'Header x saperne la lunghezza in tempo?!
__________________
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 : 16-06-2007 alle 16:25. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
In modo da non reinventare la ruota intendo ... Cosa ci guadagno a lavorare con le MMIO al posto di queste ultime MCI?! Ci guadagno in controllo?! Ci perdo in portabilità verso Linux?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
In ogni caso, visto che le funzionalità di "multimedia" sono profondamente diverse tra differenti sistemi operativi.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#10 | ||
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Intendo che le API controllano se è presente l'HW con qalche System Call e se questo NON c'è sono impostate per dare errore e crepare. Tutto in maniera trasparente al programmatore. Per imparare ad arrangiarmi e NON + a chiedere, anche se è bello discorrere con altri programmatori: ogni volta che voglio programmare qualcosa in C, come in questo caso lo smanettamento nei sistemi multimediali, devo andare a vedere su MSDN se c'è qualcosa che fa al caso mio e poi decidere cosa voglio e poi procedere?! Quote:
Cosa ci vorrebbe, il JAVA?!
__________________
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 : 14-06-2007 alle 13:21. |
||
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Dopotutto visto che sono solo dei parser di strutture predefinite non c'è motivo per cui debbano essere legati ad una specifica piattaforma software. |
|
![]() |
![]() |
![]() |
#12 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Tra le API per il multimedia c'è una funzione UINT waveOutGetNumDevs(VOID) che fa nient'altro che ritornare il numero di dispositivi audio di output (sul mio PC d'ufficio che non ha scheda audio, ritorna un bel 0). È ipotizzabile che MCI usi questa funzione per sapere se è possibile riprodurre un file audio. Ovviamente non ne posso essere sicuro ..... Quote:
Poi comunque chiedi pure, se hai dubbi. Ci sono librerie apposite cross-platform ma il problema è solo "spostato". Non sei quindi tu a doverti preoccupare della compatibilità ma c'è stato qualcun'altro che si è preoccupato di "incapsulare" i dettagli sulle differenze tra i vari S.O. e di esporre al programmatore una API comune. Java in effetti ha delle API standard per il multimedia. ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
1] Non riesco a trovarle, manco googlando o coi tools di Google, saranno in decima pagina forse. ![]() 2] Se ci sono, non son ben conosciute o descritte, non sono pubblicizzate insomma. ![]() 3] Se ci fosse 1 posto dove trovarle tutte, un po' come DistroWatch.com per le distribuzioni di Linux, tutto sarebbe + semplice. 4] Penso che ci saranno anche N librerie x stampare a video, ma io mi riferivo a qualcosa di "standard" o CMQ "standard de facto".
__________________
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 : 14-06-2007 alle 15:15. |
|
![]() |
![]() |
![]() |
#14 | |||
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Una applicazione sviluppata con queste windows.h inside la posso usare SOLO su Windows XP e Windows Vista?! Quote:
![]() Quote:
Già il C++ ed il C# non mi paiono completamente standarizzati, quindi il Java mi affascina parecchio. Il fatto di utilizzare la struttura PILA (STACK) ad esempio con la propria classe ed i propri metodi e fare le estensioni, etc... lo trovo una figata.
__________________
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 : 14-06-2007 alle 15:17. |
|||
![]() |
![]() |
![]() |
#15 | ||||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Quote:
Se cerchi "mp3 decoder source" nella prima pagina trovi 2 delle 3 alternative che ti ho dato. Quote:
Inoltre se cerchi uno standard de facto sicuramente non puoi usare le API Win32 che standard non sono. Comunque solo per ribadire che la portabilità in C non è per niente un'utopia, anzi è il linguaggio più portabile che esista. Pensa un pò per quante piattaforme è disponibile Java (la JVM chissà con cosa sarà scritta...), il C ANSI ne supporta anche di più! Ultima modifica di tomminno : 14-06-2007 alle 17:02. |
||||
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
![]() Quindi da 32 a 64 bit?! ![]() ... dovrebbe essere così perchè L indica il "long double" mi pare e quindi con la virgola mobile.
__________________
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 : 16-06-2007 alle 14:19. |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Esatto, un unsigned long int, a 32 bit (che poi è il tipo di dato DWORD).
Esatto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Sempre con Andbin stiamo lavorando al fatto che fallisce la lettura dei file MP4 intesi come contenitore A-V in AVI's style.
Col codice che segue viene riportato a video il nomero del errore: Codice:
#define STRICT #include <windows.h> #include <stdio.h> int main (int argc, char *argv[]) { MCIERROR mciErr; MCI_OPEN_PARMS mciOpen; MCI_SET_PARMS mciSet; MCI_STATUS_PARMS mciStatus; MCI_GENERIC_PARMS mciGen; char stringa[512]; if (argc == 2) { mciOpen.dwCallback = (DWORD_PTR) NULL; mciOpen.lpstrDeviceType = (char*) MCI_DEVTYPE_DIGITAL_VIDEO; mciOpen.lpstrElementName = argv[1]; mciOpen.lpstrAlias = NULL; if ((mciErr = mciSendCommand ((MCIDEVICEID) NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD) &mciOpen)) == 0) { mciSet.dwCallback = (DWORD_PTR) NULL; mciSet.dwTimeFormat = MCI_FORMAT_MILLISECONDS; if ((mciErr = mciSendCommand (mciOpen.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT | MCI_WAIT, (DWORD) &mciSet)) == 0) { mciStatus.dwCallback = (DWORD_PTR) NULL; mciStatus.dwItem = MCI_STATUS_LENGTH; if ((mciErr = mciSendCommand (mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD) &mciStatus)) == 0) { printf ("Lunghezza: %lu millisecondi\n", mciStatus.dwReturn); } else { mciGetErrorString(mciErr, stringa, 512); printf("\nERRORE 1: %d> %s\n", mciErr, stringa); } } else { mciGetErrorString(mciErr, stringa, 512); printf("\nERRORE 2: %d> %s\n", mciErr, stringa); } mciGen.dwCallback = (DWORD_PTR) NULL; mciErr = mciSendCommand (mciOpen.wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD) &mciGen); } else { mciGetErrorString(mciErr, stringa, 512); printf("\nERRORE 3: %d> %s\n", mciErr, stringa); } return 100; } else { printf("\nERRORE 4!\n"); return -100; } } ![]() Quindi 281 - 256 (della base) = 25 Quote:
MCIERR_EXTENSION_NOT_FOUND: "Impossibile determinare il tipo di dispositivo dall'estensione data." "The specified extension has no device type associated with it. Specify a device type." "L'estensione specificata non ha tipo di dispositivo connesso con esso. Specifichi un tipo di dispositivo." Il che mi lascia così ![]() ![]() Come si specificano i dispositivi?! ![]()
__________________
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 : 28-06-2007 alle 16:21. |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Questo link:
Impossibile determinare la periferica dall'estensione di nome di file specificato lo si trova cercando su Google la stringa che si è fatta stampare nel codice: mciGetErrorString(mciErr, stringa, 512); printf("\nERRORE 1: %d> %s\n", mciErr, stringa); Quindi basta andare ad aggiungere la stringa: mp4 con valore MPEGVideo in quella chiave di registro. ![]()
__________________
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 : 28-06-2007 alle 17:23. |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Possibile che installando dei CoDec differenti la funzione che usa le MCI scazzi la lunghezza del file?
Io ho questo MP3: iTourist_presentazione.mp3 da 1m17s e invece mi ritorna una bella lunghezza di 2m21s ovvero 141632ms. Praticamente dal K-Lite sono passato al: ffdshow + Haali
__________________
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 : 12-07-2007 alle 21:18. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:51.