Android MediaMetadataRetriever setDataSource失败

时间:2013-07-13 12:02:04

标签: android video media

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

我不知道我做错了什么 - 有人帮帮我,拜托!此代码也适用于音频文件,但不适用于视频。

4 个答案:

答案 0 :(得分:3)

public static String getFileDuration(Context context, File file) {
        String result = null;
        try {
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            FileInputStream 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{
           retriever.release()
           stream.close()
        }  
        return result;
    }

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Kirill F.'s answer帮我解决了这个错误。

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

答案 3 :(得分:0)

FileInputStream对我有用。

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