【问题标题】:MediaMetadataRetriever.setDataSource(Native Method) causes RuntimeException: status = 0x80000000MediaMetadataRetriever.setDataSource(Native Method) 导致 RuntimeException: status = 0x80000000
【发布时间】:2019-08-10 03:13:52
【问题描述】:

我尝试使用 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)

奇怪的是,这仅在装有 Android 4.2.2 的 HTC One X 上失败。应用程序可以在其他具有其他 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.2.2 的 android 依赖项,它仍然无法正常工作。必须尝试其他解决方案。

标签: android


【解决方案1】:

自己打开文件并使用 FileDescriptor 似乎在 API 10 上效果更好:

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

【讨论】:

  • 这与添加以下权限相结合,为我解决了问题。
  • 这应该是一个可以接受的答案,在 Android 4.1.2、4.4、5 上进行了测试,并且可以正常工作
  • 我已经尝试过这个想法,但我仍然看到同样的崩溃问题。 ://
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答。是否有任何 mvn 依赖项可用于将您的库包含到我的项目中?或者有什么jar可以直接下载?
  • 我将你的 lib 打包到 apklib 并包含到我的项目中。我在我的设备上安装并部署了应用程序,当我使用 android.media.MediaMetadataRetriever: setDataSource(...) 时出现与之前相同的错误。有没有其他方法可以使用 android apk 获取媒体文件的持续时间?
  • ...也获取视频文件的帧位图?
  • 这里有一个自述文件:github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/…。您可以从这里下载预构建的库:github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/…。基本上,您可以将它们解压缩到您的应用程序“libs”文件夹中。您需要将实际代码链接为库。
  • 另外,您可以使用演示应用程序测试 URL:github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/…。此演示将显示文件中包含的所有元数据(包括)标签和艺术。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    将 setDataSource() 方法放在 try-catch 块中解决了这个问题。

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

    【讨论】:

    • 请在答案中添加更多详细信息
    猜你喜欢
    • 2018-02-12
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多