2016-04-30 13 views
6

Ich möchte die mp4-Metadaten lesen und bearbeiten (schreiben). Besonders möchte ich lesen/schreiben Tag Metadaten in Android wie in der folgenden Abbildung gezeigt.Android: Lesen und Schreiben .mp4 metadata -Tag

Mp4 Metadata Picture

ich für diese im Internet gesucht und gefunden mp4Parser, aber ich denke, mp4Parser nicht schreiben Titel Schlagwort.

Für .jpg Datei verwenden wir XPKeyword Metadaten, die Titel darstellt. So, wie man dasselbe für .mp4 Datei tut.

Antwort

7

Das Android SDK enthält die Klasse MediaMetadataRetriever alle Metadatenwerte in Ihrer Datei abzurufen, können Sie mehr lesen über MetaDaten here Werte.

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

bearbeiten/schreiben Metadaten, Android SDK Passt nicht jede Methode, die wahrscheinlich durch Copyright-Probleme, aber Sie können wie Optionen zur Verfügung:

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

Ich erhalte IllegalArgumentException mit Ihrem oben angegebenen MediaMetadataRetriever-Code. –

+0

Hallo, in welcher Zeile? – Jorgesys

+0

In dieser Zeile: - retriever.setDataSource (file.getAbsolutePath()); –

0

Ich hoffe, es ist nicht zu spät, aber wenn Sie Metadatenfelder in MP4-Dateien hinzufügen/bearbeiten/löschen möchten, können Sie die Metadatenbearbeitungsklassen von JCodec verwenden.

Es gibt ein CLI-Tool, das von einer Java-API unterstützt wird. Die CLI ist in org.jcodec.movtool.MetadataEditorMain und die API ist in org.jcodec.movtool.MetadataEditor.

Lesen Sie mehr darüber: http://jcodec.org/docs/working_with_mp4_metadata.html

Also im Grunde, wenn Sie einige Metadaten, die Sie wissen müssen hinzufügen möchten, welche Taste (n) es entspricht. Eine Möglichkeit, dies herauszufinden, besteht darin, eine Beispieldatei zu prüfen, die bereits die benötigten Metadaten enthält.Hierfür können Sie die JCodec CLI-Tool ausführen, das nur alle vorhandenen Metadatenfelder wird ausdrucken (Schlüssel mit Werten):

./metaedit <file.mp4> 

Dann, wenn Sie den Schlüssel kennen, mit Ihnen zu arbeiten, wollen entweder die gleiche CLI verwenden Werkzeug:

# Changes the author of the movie 
./metaedit -f -si ©ART=New\ value file.mov 

oder dasselbe über das Java API:

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 

Um ein Metadatenfeld aus einer Datei zu löschen:

Um Zeichenfolge zu konvertieren zu integer fourcc Sie so etwas wie verwenden:

byte[] bytes = "©ART".getBytes("iso8859-1"); 
int fourcc = 
    ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt(); 

Wenn Sie die Android-Metadaten bearbeiten möchten/Löschen Sie benötigen, um einen anderen Satz von fucntion zu verwenden (da es gespeichert ist anders als iTunes Metadaten):

./metaedit -sk com.android.capture.fps,float=25.0 file.mp4 

oder alternativ können die gleichen durch die 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