MediaExtractor,带原始/资产文件的MediaMetadataRetriever

我尝试读取原始/资产文件夹内的video文件,我尝试了以下方法,但没有一个工作。 我正在API 16testing。每种方法,我尝试与无mp4扩展。 我真的很感激有人可以帮助我

所有的方法不会崩溃, MediaMetadataRetriever可以设置数据源,但不能获得宽度,高度和截图。 VideoExtractor总是返回

 06-04 16:44:10.519: E/FileSource(8695): Failed to open file FILE_PATH. (No such file or directory) 06-04 16:44:10.519: E/DecodeActivity(8695): Can't find video info! 

方法1:android.resource

 String filePath = "android.resource://" + this.activity.getPackageName() + "/raw/green_backhand_slice"; videoExtractor.setDataSource(activity.getApplicationContext(), Uri.parse(filePath), null); metaRetriever.setDataSource(act.getApplication(), Uri.parse(filePath)); 

方法2:android_asset

 this.filePath = "file:///android_asset/green_backhand_slice"; videoExtractor.setDataSource(activity.getApplicationContext(), Uri.parse(this.filePath), null); metaRetriever.setDataSource(act.getApplication(), Uri.parse(filePath)); 

方法3:资产文件描述符

 AssetFileDescriptor assetFD = null; try { assetFD = getAssets().openFd("green_backhand_slice.mp4"); } catch (IOException e) { e.printStackTrace(); } metaRetriever.setDataSource(assetFD.getFileDescriptor()); 

Solutions Collecting From Web of "MediaExtractor,带原始/资产文件的MediaMetadataRetriever"

这里有一些方法来做到这一点:

1.raw:

 final AssetFileDescriptor afd=getResources().openRawResourceFd(R.raw.t); mediaMetadataRetriever.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

2.raw as uri:

 final String uriPath="android.resource://"+getPackageName()+"/raw/t"; final Uri uri=Uri.parse(uriPath); mediaMetadataRetriever.setDataSource(getApplication(),uri); 

3.assets:

 final AssetFileDescriptor afd=getAssets().openFd("t.mp4"); mediaMetadataRetriever.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());