Spero che non sia troppo tardi, ma se si desidera aggiungere/modificare/eliminare campi di metadati su file MP4 è possibile utilizzare le classi di modifica dei metadati di JCodec.
C'è uno strumento CLI supportato da un'API java. La CLI è in org.jcodec.movtool.MetadataEditorMain e l'API è in org.jcodec.movtool.MetadataEditor.
Per saperne di più su di esso: http://jcodec.org/docs/working_with_mp4_metadata.html
Quindi, in pratica, quando si desidera aggiungere alcuni metadati è necessario sapere quale chiave (s) corrisponde a. Un modo per scoprirlo è ispezionare un file di esempio che ha già i metadati necessari.Per questo si può eseguire lo strumento CLI del JCodec che sarà solo stampare tutti i campi dei metadati esistenti (chiavi con valori):
./metaedit <file.mp4>
Poi, quando si conosce la chiave che si desidera lavorare con è possibile utilizzare lo stesso CLI strumento:
# Changes the author of the movie
./metaedit -f -si ©ART=New\ value file.mov
o la stessa cosa tramite l'API Java:
MetadataEditor mediaMeta = MetadataEditor.createFrom(new
File("file.mp4"));
Map<Integer, MetaValue> meta = mediaMeta.getItunesMeta();
meta.put(0xa9415254, MetaValue.createString("New value")); // fourcc for '©ART'
mediaMeta.save(false); // fast mode is off
Per eliminare un campo di metadati da un file:
MetadataEditor mediaMeta = MetadataEditor.createFrom(new
File("file.mp4"));
Map<Integer, MetaValue> meta = mediaMeta.getItunesMeta();
meta.remove(0xa9415254); // removes the '©ART'
mediaMeta.save(false); // fast mode is off
Per convertire stringa a intero fourcc si può usare qualcosa di simile a:
byte[] bytes = "©ART".getBytes("iso8859-1");
int fourcc =
ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt();
Se si desidera modificare/cancellare i metadati di Android è necessario utilizzare un diverso insieme di fucntion (perché è memorizzata diverso rispetto metadati iTunes):
./metaedit -sk com.android.capture.fps,float=25.0 file.mp4
o in alternativa lo stesso attraverso l'API:
MetadataEditor mediaMeta = MetadataEditor.createFrom(new
File("file.mp4"));
Map<String, MetaValue> meta = mediaMeta.getKeyedMeta();
meta.put("com.android.capture.fps", MetaValue.createFloat(25.));
mediaMeta.save(false); // fast mode is off
Ricevo IllegalArgumentException utilizzando il codice MediaMetadataRetriever pubblicato sopra. –
ciao, in quale linea? – Jorgesys
In questa riga: - retriever.setDataSource (file.getAbsolutePath()); –