Domanda

Sono attualmente in fase di spostare la mia applicazione C # verso Qt / C ++. Sono in esecuzione in problemi con lunghezze da TagLib. Trovo strano che durate TagLib # rendimenti audio in millisecondi, mentre TagLib ritorna sue durate (errati) in pochi secondi. TagLib restituisce solo a zero per i valori di lunghezza, mentre TagLib # rimane corretta.

Questa è la mia fonte in C # / TagLib # ...

TagLib.File tagfile = TagLib.File.Create(path);
uint milliseconds = (uint)tagfile.Properties.Duration.TotalMilliseconds;

E qui è quello che dovrebbe essere quasi equivalente in C ++ / TagLib. Ho anche costretto a leggere accuratamente. Nessun successo.

TagLib::FileName fn(path);
TagLib::FileRef fr(fn, true, TagLib::AudioProperties::Accurate);
uint length = fr.audioProperties()->length();

Funziona come previsto per una buona maggioranza dei miei file multimediali. Tuttavia, un paio di selezionare i file audio non riescono a restituire tutte le proprietà audio (il resto delle informazioni tag legge bene!). La stessa identica proprietà audio vengono restituiti senza problemi sul TagLib #.

Tutte le idee sono apprezzati. Grazie.

Qualcuno ha qualche più idee prima che le estremità di taglie?

È stato utile?

Soluzione

ciao c'è una patch per taglib che calcolare la lunghezza in millisecondi, questo ragazzo ha aggiunto un metodo (lengthMilliseconds ()) che restituiscono la lunghezza in millisecondi, che forse potrebbero essere utili per voi: http://web.archiveorange.com/archive/v/sF3Pjr01lSQjsqjrAC7L

Altri suggerimenti

Molto è cambiato in TagLib # 's analisi di file audio da quando è stato originariamente portato su, quindi è difficile dire esattamente dove si sarebbe verificato la differenza. Si può controllare il vostro programma di C ++ per i messaggi di debug.

La mia ipotesi è che la differenza è nel modo in cui le due biblioteche reagiscono alle intestazioni non valide. Sembra che se la prima testata di trama che trova non è valido, TagLib non calcolare i valori di proprietà audio. TagLib #, d'altra parte, cerca la prima intestazione valida nella prima 16KiB della parte audio del file. Se la prima intestazione che incontra è danneggiato, sarà la scansione per il prossimo. Se non ricordo male, un tag ID3v2 erroneamente salvato potrebbe comportare 0xFF FF FF FF che appaiono all'inizio della sezione audio del file. Ciò farebbe scattare il tipo di guasto sopra descritto.

Il problema è alla linea 166 del taglib / MPEG / mpegproperties.cpp. Questo potrebbe essere risolto utilizzando lo stesso approccio come linee 171 a 191, ma si vuole aggiornare il codice a rinunciare dopo un punto nel caso in cui non è in realtà un file MP3.

Mentre scrivo, TagLib 1.11 Beta 2 supporta in modo nativo ottenere la lunghezza di audio in millisecondi. È possibile farlo con il seguente codice:

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top