MediaMetadataRetriever setDataSource抛出IllegalArgumentException

Nul*_*ion 13 android mediametadataretriever

我正在尝试使用此类获取远程视频的大小,如果视频是远程的,我将收到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();
}   
Run Code Online (Sandbox Code Playgroud)

错误是在这一行引发的:

retriever.setDataSource(context, uri);
Run Code Online (Sandbox Code Playgroud)

和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)
Run Code Online (Sandbox Code Playgroud)

Wil*_*ann 18

也许你遇到了这个 bug.如果是这样尝试:

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();
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以随时尝试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();
Run Code Online (Sandbox Code Playgroud)


kdb*_*lue 9

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

我解决了只是把android:requestLegacyExternalStorage="true"Manifest 放在里面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>
Run Code Online (Sandbox Code Playgroud)