MediaMetadataRetriever.setDataSource(本机方法)导致RuntimeException:status = 0x80000000

时间:2013-09-20 12:46:14

标签: android

我尝试使用android.media.MediaMetadataRetriever在我的Android应用程序中从jpg文件中获取一些元数据信息。这是我的代码:

public long getDuration(String videoFilePath, Context context) {
    File file = loadVideoFile(videoFilePath);
    if (file == null) {
        return -1;
    }

    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    file.setReadable(true, false);
    retriever.setDataSource(file.getAbsolutePath());
    return getDurationProperty(retriever);
}

当我调用setDataSource方法时,它会抛出RuntimeException:

09-10 15:22:25.576: D/PowerManagerService(486): releaseWakeLock(419aa2a0): CPU_MIN_NUM , tag=AbsListViewScroll_5.0, flags=0x400
09-10 15:22:26.481: I/HtcModeClient(12704): handler message = 4011
09-10 15:22:26.481: E/HtcModeClient(12704): Check connection and retry 9 times.
09-10 15:22:27.681: W/dalvikvm(13569): threadid=1: thread exiting with uncaught exception (group=0x40bc92d0)
09-10 15:22:27.696: E/AndroidRuntime(13569): FATAL EXCEPTION: main
09-10 15:22:27.696: E/AndroidRuntime(13569): java.lang.RuntimeException: setDataSource failed: status = 0x80000000
09-10 15:22:27.696: E/AndroidRuntime(13569):    at android.media.MediaMetadataRetriever.setDataSource(Native Method)
09-10 15:22:27.696: E/AndroidRuntime(13569):    at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:66)

奇怪的是,这只能在HTC One X和Android 4.2.2上失败。应用程序适用于其他具有其他Android版本的设备(例如4.2.1)。

编辑:

哇。也许是关于我对maven的错误依赖:

<dependency>
    <groupId>com.google.android</groupId>
    <artifactId>android</artifactId>
    <version>4.1.1.4</version>
    <scope>provided</scope>
</dependency>

但我无法找到android 4.2.2的依赖。在哪里可以找到它?

4 个答案:

答案 0 :(得分:4)

自己打开文件并使用FileDescriptor似乎在API 10上工作得更好:

FileInputStream inputStream = new FileInputStream(file.getAbsolutePath());
retriever.setDataSource(inputStream.getFD());
inputStream.close();

答案 1 :(得分:2)

MediaMetadataRetriever似乎无法在所有Android版本中保持一致。我建议尝试FFmpegMediaMetadataRetriever(免责声明:这是我的项目)。它具有与MediaMetadataRetriever相同的接口:

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
retriever.setDataSource(file.getAbsolutePath());
retriever.release();

答案 2 :(得分:0)

经过大量研究+反复试验,我得出结论并同意https://stackoverflow.com/a/46082355/2997806。我尝试用以下视频格式和其他视频文件格式重现异常:AVI,MPG / MPEG,MOV,mov,mp4,m4v,flv,WMV,我注意到AVI,MPG / MPEG和WMV每次对我来说都是例外。最好在运行方法之前排除它们,并用try-catch对其进行包装。

答案 3 :(得分:-1)

将setDataSource()方法放入try-catch块中可以解决此问题。

try {
        metaRetriver.setDataSource(AudioPath);
       //
    } catch (Exception e) {
        //
    }