MediaMetadataRetriever setDataSource throws IllegalArgumentE



我正在尝试使用此类获取远程视频的大小,如果视频是远程的,我会得到IllegalArgumentException。

视频是存储在一台服务器中的MP4...

如果我

使用媒体播放器播放视频,视频可以正确播放,但是如果我尝试这样做,它会出错:

try {
    MediaMetadataRetriever retriever = new  MediaMetadataRetriever();
    Bitmap bmp = null;      
    retriever.setDataSource(context, uri);
    bmp = retriever.getFrameAtTime();           
    videoHeight = (int) (bmp.getHeight()*((float)getIntWidth()/bmp.getWidth()));
} catch (Exception e) {
    e.printStackTrace();
}   

错误在此行中引发:

retriever.setDataSource(context, uri);

和 URI 包含Uri.parse("http://www.myweb.com/myvideo.mp4");

代码中有什么问题?

12-19 13:38:08.610: W/System.err(13333): java.lang.IllegalArgumentException
12-19 13:38:08.611: W/System.err(13333):    at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:175)

也许你遇到了这个错误。如果是这样,请尝试:

try {
    MediaMetadataRetriever retriever = new  MediaMetadataRetriever();
    Bitmap bmp = null;      
    retriever.setDataSource("http://www.myweb.com/myvideo.mp4", new HashMap<String, String>());
    bmp = retriever.getFrameAtTime();           
    videoHeight = (int) (bmp.getHeight()*((float)getIntWidth()/bmp.getWidth()));
} catch (Exception e) {
    e.printStackTrace();
}

如果这不起作用,您可以随时尝试FFmpegMediaMetadataRetriever:

FFmpegMediaMetadataRetriever retriever = new  FFmpegMediaMetadataRetriever();
try {
    Bitmap bmp = null;      
    retriever.setDataSource("http://www.myweb.com/myvideo.mp4"));
    bmp = retriever.getFrameAtTime();           
    videoHeight = (int) (bmp.getHeight()*((float)getIntWidth()/bmp.getWidth()));
} catch (Exception e) {
    e.printStackTrace();
}
retriever.release();

我遇到了同样的错误,我使用的是 android 10。

我解决了只是将android:requestLegacyExternalStorage="true"放入application中的清单中的问题。

看这里

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
    android:requestLegacyExternalStorage="true"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

就我而言,我正在创建一个简单的元数据提取测试应用程序,因此我使用 adb 将文件复制到我的手机,如下所示:

adb push 350950598.mp4 /sdcard/Movies

但我忘了在应用程序清单中添加读取外部存储目录权限。

具体说来:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.cool.package.name">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
</manifest>

添加这些权限为我修复了它,即使是简单的文件字符串调用:

    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    mediaMetadataRetriever.setDataSource(movie.getPath());

当然,如果您的目标是API 23 +棉花糖,那么您也必须动态请求这些权限。

try {
    MediaMetadataRetriever retriever = new  MediaMetadataRetriever();
    Bitmap bmp = null;      
    retriever.setDataSource(uri.toString(), new HashMap<String, String>());
    bmp = retriever.getFrameAtTime();           
    videoHeight = (int) (bmp.getHeight()*((float)getIntWidth()/bmp.getWidth()));
} catch (Exception e) {
    e.printStackTrace();
}   

如果您使用的是Android 10或更高版本,那么您需要将requestLegacyExternalStorage提及为true。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:requestLegacyExternalStorage="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

注意:如果这样做仍然面临相同的问题,则需要重新安装该应用程序。 :)

如果您

使用的是 Android Marshmallow 或更高版本,则需要授予运行时权限。

安卓清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.cool.package.name">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...

然后在活动中添加运行时权限代码。之后,运行您的应用程序,它应该可以工作。

相关内容

  • 没有找到相关文章

最新更新