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