从Android应用中的URL获取视频时长

时间:2016-04-19 03:37:52

标签: android android-video-player

我正在开发一个应用程序,用户可以在其中查看存储在SERVER上的所有视频信息和标题。我几乎完成了它,除了无论我如何编码它,我都无法从给定的URL获取视频持续时间。让我们从互联网上的某个地方获取这个演示视频:CLICK HERE FOR VIDEO PATH 我希望应用能够获得视频时长,而无需打开视频本身。

我正在尝试在Android上使用的代码是:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource("https://12-lvl3-pdl.vimeocdn.com/01/1386/0/6932347/10573836.mp4?expires=1461047937&token=037972137fdfc4c2d9902");
    String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    long timeInmillisec = Long.parseLong( time );
    long duration = timeInmillisec / 1000;
    long hours = duration / 3600;
    long minutes = (duration - hours * 3600) / 60;
    long seconds = duration - (hours * 3600 + minutes * 60);
    Toast.makeText(context,Long.toString(timeInmillisec),Toast.LENGTH_SHORT).show();

但我得到的结果是:java.lang.IllegalArgumentException 第2行是“retriever.setDataSource()”。 任何人都可以帮我找到我做错了什么,或者android提供了另一种获取所需信息的方法吗?

2 个答案:

答案 0 :(得分:9)

也许您正在寻找FFmpegMediaMetadataRetriever

FFmpegMediaMetadataRetriever 类为输入媒体文件中的检索框架和元数据提供统一的界面。

通过使用 FFmpegMediaMetadataRetriever METADATA_KEY_DURATION 常量,您可以获得视频的持续时间。它会将字符串返回给您,然后您可以将其转换为LONG以获得TIME。

以下是您应该使用的代码:

FFmpegMediaMetadataRetriever mFFmpegMediaMetadataRetriever = new MediaMetadataRetriever();
mFFmpegMediaMetadataRetriever .setDataSource("Your video url");
String mVideoDuration =  mFFmpegMediaMetadataRetriever .extractMetadata(FFmpegMediaMetadataRetriever .METADATA_KEY_DURATION);
long mTimeInMilliseconds= Long.parseLong(mVideoDuration);

如果仍然无效,请使用

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
if (Build.VERSION.SDK_INT >= 14)
 retriever.setDataSource("Your video url", new HashMap<String, String>());
else
 retriever.setDataSource("Your video url");

来自您的代码。

希望它会对你有所帮助。祝你好运。

答案 1 :(得分:4)

这对我有用,

 MediaMetadataRetriever retriever = new MediaMetadataRetriever();
  retriever.setDataSource("YourVideofileUrl", new HashMap<String, String>());
  String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
  long timeInMillisec = Long.parseLong(time);
  retriever.release();
  String duration=convertMillieToHMmSs(timeInMillisec); //use this duration

 public static String convertMillieToHMmSs(long millie) {
    long seconds = (millie / 1000);
    long second = seconds % 60;
    long minute = (seconds / 60) % 60;
    long hour = (seconds / (60 * 60)) % 24;

    String result = "";
    if (hour > 0) {
        return String.format("%02d:%02d:%02d", hour, minute, second);
    }
    else {
        return String.format("%02d:%02d" , minute, second);
    }

}