2016-04-30 14 views
6

Chcę odczytać i edytować (zapisać) metadane mp4. Szczególnie chcę odczytać/zapisać Tag metadanych w Androidzie, jak pokazano na poniższym rysunku.Android: odczytywanie i zapisywanie metadanych .mp4 -Tag

Mp4 Metadata Picture

Szukałem tego w internecie i okazało mp4Parser, ale myślę mp4Parser nie pisać Tytuł Keyword.

Dla pliku .jpg używamy metadanych XPKeyword, które reprezentują tytuł. Tak samo jak zrobić to samo dla pliku .mp4.

Odpowiedz

7

Android SDK zawiera klasę MediaMetadataRetriever aby pobrać wszystkie wartości metadanych wewnątrz pliku, można przeczytać więcej o metadane wartości 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

do edycji/zapisu metadanych, Android SDK doesnt ma żadnego sposobu, prawdopodobnie przez kwestie praw autorskich, ale można korzystać z opcji takich jak:

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

Otrzymuję IllegalArgumentException przy użyciu twojego MediaMetadataRetriever kodu zamieszczonego powyżej. –

+0

cześć, w której linii? – Jorgesys

+0

W tym wierszu: - retriever.setDataSource (file.getAbsolutePath()); –

0

Mam nadzieję, że nie jest za późno, ale jeśli chcesz dodawać/edytować/usuwać pola metadanych w plikach MP4, możesz użyć klas edycji metadanych JCodec.

Istnieje narzędzie CLI wspierane przez interfejs API języka Java. CLI jest w org.jcodec.movtool.MetadataEditorMain, a API jest w org.jcodec.movtool.MetadataEditor.

Czytaj więcej na ten temat: http://jcodec.org/docs/working_with_mp4_metadata.html

Więc w zasadzie, jeśli chcesz dodać metadane trzeba wiedzieć jakiego klucza (y) odpowiadają. Jednym ze sposobów sprawdzenia jest sprawdzenie przykładowego pliku, który już posiada potrzebne metadane.W tym celu można uruchomić narzędzie CLI JCodec, że będzie po prostu wydrukować wszystkie istniejące pola metadanych (elementy o wartościach):

./metaedit <file.mp4> 

wtedy, gdy wiesz, klawisz, który chcesz pracować z was może użyć tego samego interfejsu CLI narzędzie:

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

lub samo za pośrednictwem interfejsu 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 

Aby usunąć pole metadanych z pliku:

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 

Aby przekonwertować ciąg do liczby całkowitej fourcc można użyć coś takiego:

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

Jeśli chcesz edytować/usunąć android metadane trzeba użyć innego zestawu fucntion (bo jest przechowywany inaczej niż metadanych iTunes)

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

lub alternatywnie samo przez 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 
Powiązane problemy