12

我正在尝试使用 AndroidMediaMetadataRetriever来获取 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

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

4

4 回答 4

10
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;
}
于 2016-04-06T08:23:08.553 回答
3

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

于 2015-09-23T19:27:10.113 回答
0

FileInputStream 为我工作。

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

于 2018-10-06T15:33:32.467 回答
-1

Kirill F. 的回答帮助我解决了这个错误。

path = path.substring(7);
mmr.setDataSource(path);
于 2017-05-12T11:17:43.400 回答