|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
[C] Modificare attributi file mp3
Salve a tutti! Vorrei fare un programmino in c che mi permetta di modificare gli attributi ID3v1 di alcuni file mp3 (titolo, artista, anno, genere...). Ho fatto una ricerchina veloce ma mi appaiono tutti siti di mp3 da scaricare...
Qualcuno mi sa dare una mano??? |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
per quanto riguarda il C/C++ quel sito mi rimanda a questa pagina da dove ho scaricato la versione 3.8.3.
tuttavia qualsiasi documentazione reperibile su quel sito si riferisce al c++ e non al c. non so dove cercare... |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 39
|
Ma ti serve il programma già fatto oppure solo delle indicazioni su come farlo?
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
no, voglio farmi un programmino che mi sistemi gli id3 in un certo formato. sono stanco di farlo sempre io a mano!
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 39
|
Avevo fatto un programmino a suo tempo, ma dovrei vedere se me lo ritrovo in qualche floppy ...il mio disco rigido l'anno scorso ha tolto del fumo....
Comunque vedrò di spiegarti qualcosa, per quanto mi ricordo. Innanzitutto esistono due tipi principali di tag ID3, la versione 1.0/1.1 e la 2.4 (questa mi pare sia l'ultima... o almeno lo era quando mi interessavo di tag qualche annetto fa). Esistono differenze sostanziali tra le due. Innanzitutto la 1.1 (che si differenzia dalla 1.0 solo perché permette l'inserimento del numero di traccia... mi pare Perciò meglio pensare al tag ID3v1. Questo occupa gli ultimi 128 byte del file MP3. Per "prelevarlo" quindi puoi andare a colpo sicuro posizionandoti 128 byte prima della fine del file e leggendoli. Per identificarlo controlla la presenza della sequenza di caratteri "tag" o "TAG" tra i primi tre di tutto questo blocco. Seguono quindi i pochi campi, 6 in tutto. Ecco lo schema completo del blocco: Codice:
Identificatore 3 Titolo 30 Autore 30 Album 30 Anno 4 Commento 30 Genere 1 TOTALE = 128 bytes La prima: questa è la struttura del 1.0. L'1.1 permette anche la memorizzazione del numero di traccia, tuttavia mantiene la totale compatibilità col 1.0: non cambia infatti la dimensione del tag. Sfruttando la relativa inutilità di un campo commento di soli 30 caratteri, infatti, si era stabilito che il numero di traccia fosse inserito proprio come ultimo byte del commento. Ma per essere identificato e non confuso col commento stesso, è preceduto da un carattere 0x00 che lo delimita, cosicché il campo riservato al commento si riduce a 28 bytes. Se manca il numero di traccia, comunque, il commento può prendersi tutti i 30 bytes. La seconda: I campi sono fissi, non puoi cambiare la loro dimensione e in caso non li occupi tutti, devi riempirli con 0x00 (meglio fare così che utilizzare gli spazi 0x20). Terza: l'anno va memorizzato come stringa (di quattro caratteri). Quarta: per il genere si utilizza una tabella bella lunga con un 150 generi ad ognuno dei quali corrisponde un numero ... purtoppo anche questa dovrei vedere se me la ritrovo da qualche parte. Faccio una ricerchina e domani ti riferisco. Buona programmazione! Ciao! Ultima modifica di SnakePlissken : 02-11-2004 alle 21:12. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
SnakePlissken meriti tutto il mio rispetto!!!
sei stato veramente chiaro nella spiegazione! ho però una domanda che riguarda il genere. la tabella l'ho trovata a questo sito: http://www.mp3-howto.com/mp3-howto-22.html, non so come viene memorizzato il genere visto che non può essere come stringa perchè occupa un solo byte (secondo le indicazioni che mi hai fornito, e che ho anche visto sul sito www.id3.org), ma come fa a rappresentare i numeri fino a 128? |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
ho trovato da solo la risposta: sia il genere che il track sono due char.
|
|
|
|
|
|
#9 | ||||
|
Member
Iscritto dal: Aug 2004
Messaggi: 39
|
Quote:
Quote:
Quote:
Quote:
|
||||
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
per caso è così?? Codice:
char stringa[30]; . . stringa[i]= (char) 0x00; Codice:
stringa[i]= (char) 0; Ultima modifica di VegetaSSJ5 : 06-11-2004 alle 16:40. |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Aug 2004
Messaggi: 39
|
Queste notazioni sono tutte valide:
Codice:
stringa[i] = 0x00; // esadecimale (1 byte) stringa[i] = 0; // decimale stringa[i] = 00; // ottale stringa[i] = '\0'; // codice ASCII del carattere Io preferisco utilizzare 0x00 perché è intrinseca la specificazione di singolo byte, tu puoi fare come di più ti piace! |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Sep 2004
Città: vicino a Cosenza
Messaggi: 61
|
Ciao,
stavo facendo qualcosa di simile in C++, senza usare alcuna libreria esterna. Siccome devo corregere un po' di errori nella scrittura dei tag ID3, posto solo il codice per la lettura: <code> #include <iostream> #include <iomanip> #include <fstream> using namespace std; int main(int argc, char** argv) { if (argc == 1) { cout << "Devi specificare un file .mp3!\n"; exit(EXIT_FAILURE); } fstream fin; char buf[129]; fin.open(argv[1], ios::in | ios::binary); // apertura file in modalità binaria fin.seekg(-128, ios::end); // posizionamento 128 byte prima di EOF fin.read(buf, 128); // memorizzo questi 128 byte nel buffer di byte //controllo se è presente la stringa TAG if (strncmp(buf, "TAG", 3)) { cout << "TAG ID3 mancanti o file non valido!" << endl; exit(EXIT_FAILURE); } /* stampa artista traccia, byte 33..62 */ cout << "ARTISTA: "; for (int i = 33; i <= 62; i++) if ((buf[i] == ' ') && (buf[i+1] == ' ')) break; else cout << buf[i]; /* stampa album, byte 63..92 */ cout << "\nALBUM: "; for (int i = 63; i <= 92; i++) if ((buf[i] == ' ') && (buf[i+1] == ' ')) break; else cout << buf[i]; /* stampa traccia, byte 3..32 */ cout << "\nTITOLO: "; for (int i = 3; i <= 32; i++) if ((buf[i] == ' ') && (buf[i+1] == ' ')) break; else cout << buf[i]; </code>
__________________
<| http://fgr.altervista.org |> <| GNU/Linux Registered User #365929 |> <| GnuPG/OpenPGP key available |> |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
il codice per la lettura l'ho finito (in c), ora devo perfezionare quello per la scrittura ma purtroppo in questi giorni non ho molto tempo da dedicarci...
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
scusate ho fatto una domanda idiota...
Ultima modifica di VegetaSSJ5 : 08-11-2004 alle 02:18. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
ragazzi ho terminato la prima versione del mio programmino che permette di editare i tag id3v1.1. va migliorato sicuramente cmq intanto lo allego.
Allegato a pagina 2 Ultima modifica di VegetaSSJ5 : 27-12-2004 alle 11:47. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
mi raccomando non vi accalcate a scaricare il file giusto per darmi un parere...
accetto qualsiasi critica, anche "è inutile ed è programmato male", ma almeno scrivete qualcosa... |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
[non l'ho compilato e provato per davvero ma] Sembra ben scritto. Bravo.
L'unica cosa che a me non piace e' che non vai a capo all'inizio di un nuovo blocco, nemmeno quando inizi una routine... e poi io avrei evitato una initgenreV ed avrei usato valori costanti in una static array. Per il resto mi sembra niente male. P.S.: oltre ad id3.org e gli altri link, guardati il sito di LAME, l'ottimo encoder open source. Puoi prendere spunti da li se vuoi anche il supporto id3v2.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
non ho mai usato array statici, per questo non mi è venuta l'idea. cmq ho provato ad inizializzare l'array al di fuori del codice delle funzioni (nella dichiarazione delle variabili globali) ma il compilatore mi dava errore. usando l'array statico come potrei inizializzarlo anche fuori dalle funzioni??
Quote:
per quanto riguarda il sito di lame tu a quale ti riferisci? io sono andato qui http://lame.sourceforge.net ma non ho trovato alcuna info... |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
bug dl programma:
se l'anno è di 4 cifre, quando si visualizzano le informazioni, la riga Year:... è di questo formato: Year: <anno><commento> come mai stampa il commento a fianco all'anno? eppure nella struttura id3v1 l'anno è dichiarato array di 5 caratteri... |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Forse quando l'anno è più corto di quattro cifre trova la char[] riempita con caratteri nulli (0) e quindi si ferma, altrimenti no... comunque, usa \n alla [/i]fine[/i] di ogni printf, non all'inizio: in alcuni casi printf non stampa sullo schermo fino al prossimo \n, e quindi alcuni messaggi potrebbero non vedersi mai.
Per l'array statico, basta usare: Codice:
static char * genreV[125] = {"blues", "classic rock", "...", "e così fino alla fine"};
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:49.



















