我正在尝试使用此类获取远程视频的大小,如果视频是远程的,我将收到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)
答案 0 :(得分:19)
也许您遇到了this错误。如果是这样,试试:
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();
答案 1 :(得分:2)
就我而言,我正在创建一个简单的元数据提取测试应用程序,因此我使用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+ marshmallow,那么你也必须动态地要求这些权限。
答案 2 :(得分:2)
如果您使用的是Android Marshmallow或更高版本,则需要授予运行时权限。
Android清单文件:
<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" />
...
然后在您的活动中添加运行时权限的代码。之后,运行您的应用程序,它应该可以运行。
答案 3 :(得分:2)
我遇到了相同的错误,我正在使用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>
答案 4 :(得分:0)
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();
}