【问题标题】:MediaExtractor, MediaMetadataRetriever with Raw/Asset FileMediaExtractor、带有原始/资产文件的 MediaMetadataRetriever
【发布时间】: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());

【问题讨论】:

    标签: android android-mediacodec mediametadataretriever


    【解决方案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 哦,好的。很高兴它有帮助。
    猜你喜欢
    • 2014-02-21
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多