2016-04-30 91 views
6

我想要讀取和編輯(寫入)mp4元數據。特別是我想在Android中讀取/寫入標籤元數據,如下圖所示。Android:讀寫.mp4元數據 - 標籤

Mp4 Metadata Picture

我搜索這個互聯網上發現mp4Parser,但我認爲mp4Parser不寫標題關鍵字。

對於.jpg文件,我們使用代表標題的XPKeyword元數據。 如此相同的方式如何爲.mp4文件做同樣的事情。

回答

7

Android SDK中的類MediaMetadataRetriever檢索您的文件中的所有元數據值,你可以閱讀更多關於元數據值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

編輯/寫的元數據,Android的SDK doesn't有什麼方法,可能是版權問題,但你可以使用選項,如:

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

我使用上面發佈的MediaMetadataRetriever代碼獲取IllegalArgumentException。 –

+0

嗨,在哪一行? – Jorgesys

+0

在這一行中:--retriever.setDataSource(file.getAbsolutePath()); –

0

我希望現在還不算太晚,但是如果你想添加/編輯/刪除MP4文件的元數據字段,你可以使用JCodec的元數據編輯類。

有一個由java API支持的CLI工具。 CLI位於org.jcodec.movtool.MetadataEditorMain,API位於org.jcodec.movtool.MetadataEditor。當你想添加一些你需要知道什麼鍵(一個或多個)它對應的元數據http://jcodec.org/docs/working_with_mp4_metadata.html

所以基本上:

瞭解更多關於它。找出一種方法是檢查已經有你需要的元數據的示例文件。爲此,您可以運行JCodec的CLI工具,將剛剛打印出所有的現有的元數據字段(值的鍵):

./metaedit <file.mp4> 

然後,當你知道你想和你的工作既可以使用相同的CLI關鍵工具:

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

或通過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 

從文件中刪除元數據字段:

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 

將字符串轉換爲整數FOURCC您可以使用類似:

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

如果要編輯/刪除的Android元數據,您需要使用一套不同溫控功能的(因爲它的存儲不同於iTunes的元數據):

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

或可替代地通過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