MediaExtractor、带有原始/资产文件的 MediaMetadataRetriever

Posted

技术标签:

【中文标题】MediaExtractor、带有原始/资产文件的 MediaMetadataRetriever【英文标题】:MediaExtractor, MediaMetadataRetriever with Raw/Asset File 【发布时间】:2014-07-24 17:01:03 【问题描述】:

我尝试在 raw/assets 文件夹中读取视频文件,我尝试了以下方法,但它们都不起作用。我正在测试 API 16。每种方法,我都尝试使用和不使用 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!

方法一: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));

方法三:资产文件描述符

AssetFileDescriptor assetFD = null;
try 
    assetFD = getAssets().openFd("green_backhand_slice.mp4");
 catch (IOException e) 
    e.printStackTrace();


metaRetriever.setDataSource(assetFD.getFileDescriptor());

【问题讨论】:

【参考方案1】:

以下是一些方法:

1.原始:

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.资产:

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

【讨论】:

不错。在提供 afd.getStartOffset() 和 afd.getLength() 时,我遇到了 Assets 方法的问题。添加它们解决了这个问题。 @j7nn7k 我不明白,但很高兴这对您有所帮助。 我使用了setDataSource(afd.getFileDescriptor()),但没有用。 setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()) 工作 @j7nn7k 哦,好的。很高兴它有帮助。

以上是关于MediaExtractor、带有原始/资产文件的 MediaMetadataRetriever的主要内容,如果未能解决你的问题,请参考以下文章

Android媒体解码MediaCodec MediaExtractor学习

在 Android 中将资产或原始文件或资源文件作为 File 对象读取

我无法从构造函数(R.raw.number_one)引用原始文件夹中的文件

音视频开发系列——全面了解Android MediaExtractor

[MediaExtractor与wav文件一起使用时抛出IllegalArgumentException

Android - 将原始资产中的文件保存到外部存储以供其他应用访问,导致找不到内容根异常