2016-04-30 37 views
6

Voglio leggere e modificare (scrivere) i metadati mp4. In particolare voglio leggere/scrivere i metadati Tag in android come mostrato nella figura qui sotto.Android: lettura e scrittura .mp4 metadata -Tag

Mp4 Metadata Picture

ho cercato per questo su internet e ho trovato mp4Parser, ma penso che mp4Parser non scrivo titolo di parola chiave.

Per il file .jpg vengono utilizzati i metadati XPKeyword che rappresentano il titolo. Allo stesso modo come fare lo stesso per il file .mp4.

risposta

7

L'Android SDK contiene la classe MediaMetadataRetriever per recuperare tutti i valori dei metadati all'interno del vostro file, è possibile leggere di più sui metadati Valori here.

public void readMetaData() { 
    File sdcard = Environment.getExternalStorageDirectory(); 
    File file = new File(sdcard,"/Android/data/myfile.mp4"); 

    if (file.exists()) { 
     Log.i(TAG, ".mp4 file Exist"); 

     //Added in API level 10 
     MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
     try { 
      retriever.setDataSource(file.getAbsolutePath()); 
      for (int i = 0; i < 1000; i++){ 
       //only Metadata != null is printed! 
       if(retriever.extractMetadata(i)!=null) { 
        Log.i(TAG, "Metadata :: " + retriever.extractMetadata(i)); 
       } 
      } 
     } catch (Exception e) { 
      Log.e(TAG, "Exception : " + e.getMessage()); 
     } 
    } else { 
     Log.e(TAG, ".mp4 file doesn´t exist."); 
    } 
} 

enter image description here

Per modificare i metadati/scrittura, Android SDK Indifferente hanno alcun metodo, probabilmente per problemi di copyright, ma è possibile utilizzare le opzioni come:

https://github.com/sannies/mp4parser

http://multimedia.cx/eggs/supplying-ffmpeg-with-metadata/

https://github.com/bytedeco/javacv/blob/master/src/main/java/org/bytedeco/javacv/FFmpegFrameRecorder.java

+0

Ricevo IllegalArgumentException utilizzando il codice MediaMetadataRetriever pubblicato sopra. –

+0

ciao, in quale linea? – Jorgesys

+0

In questa riga: - retriever.setDataSource (file.getAbsolutePath()); –

0

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