【问题标题】:Android MediaMetadataRetriever setDataSource failedAndroid MediaMetadataRetriever setDataSource 失败
【发布时间】:2020-05-08 14:03:35
【问题描述】:

我正在尝试使用 Android MediaMetadataRetriever 来获取 mp4 格式的录制视频的长度 - 但我遇到了异常:

07-13 13:54:32.686: E/AndroidRuntime(19790): FATAL EXCEPTION: main
07-13 13:54:32.686: E/AndroidRuntime(19790): java.lang.RuntimeException: setDataSource failed: status = 0x80000000

我的代码是:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            retriever.setDataSource(video.getMediaUrl());
            String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            long timeInmillisec = Long.parseLong(time);

video.getMediaUrl()的路径与此类似:

file:///storage/emulated/0/Foldername/Videos/VID_20130713_135318.mp4

我不知道我在做什么错 - 请任何人帮助我!此代码也适用于音频文件,但不适用于视频。

【问题讨论】:

  • MediaMetadataRetriever 可能只是出于某种原因无法读取该特定视频文件。你试过github.com/wseemann/FFmpegMediaMetadataRetriever吗?
  • 它无法读取我给他的每个文件,这些文件是从我的相机记录下来的......所以不 - 没有测试图书馆,但也许稍后会测试它 - 在此先感谢
  • 我的意思是,问题可能与相机使用的编解码器或它如何写出元数据有关。另外,你能发布一个示例文件吗?
  • 我只是想读取从我自己的相机录制的文件 - 通过以下方式启动相机:Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); Uri fileUri = CameraFileHelper.getOutputMediaFileUri(CameraFileHelper.MEDIA_TYPE_VIDEO); intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, VIDEO_QUALITY_HIGH);

标签: android video media


【解决方案1】:
public static String getFileDuration(Context context, File file) {
    String result = null;
    MediaMetadataRetriever retriever = null;
    FileInputStream inputStream = null;

    try {
        retriever = new MediaMetadataRetriever();
        inputStream = new FileInputStream(file.getAbsolutePath());
        retriever.setDataSource(inputStream.getFD());
        long time = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
        result = String.format(context.getResources().getString(R.string.player_time_format),
        AppUtil.getPlayerMinutes(time), AppUtil.getPlayerSoconds(time));

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (RuntimeException e) {
        e.printStackTrace();
    } finally{
       if (retriever != null){
           retriever.release()
       }if (inputStream != null){
           inputStream.close()
       }
    }  
    return result;
}

【讨论】:

  • 一旦完成,总是释放检索器并关闭输入流。
  • 拯救我的一天。 tnx +1
【解决方案2】:

从视频 URI 中删除 file://,然后将其传递给 setDataSource 方法。

【讨论】:

    【解决方案3】:

    FileInputStream 适合我。

    String path = "somepath"; java.io.FileInputStream input = new FileInputStream(path); mediaMetadataRetriever.setDataSource(input.getFD());

    【讨论】:

    • 写一些解释来理解你的答案。
    【解决方案4】:

    Kirill F.'s answer 帮我修复了这个错误。

    path = path.substring(7);
    mmr.setDataSource(path);
    

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      相关资源
      最近更新 更多