получить продолжительность видео из URL-адреса в приложении для Android

Я работаю над приложением, в котором пользователь может видеть всю информацию и название видео, которые хранятся на СЕРВЕРЕ. Я почти закончил с этим, за исключением того, что независимо от того, как я его кодирую, я не могу получить продолжительность видео с заданного URL-адреса. Давайте возьмем это демонстрационное видео из Интернета: НАЖМИТЕ ЗДЕСЬ, ЧТОБЫ УЗНАТЬ ПУТЬ К ВИДЕО Я хочу, чтобы приложение получало продолжительность видео без необходимости открывать само видео.

Код, который я пытаюсь использовать на 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 есть другой способ получить необходимую информацию?


person Rainier Gaari    schedule 19.04.2016    source источник
comment
вы вызвали setDataSource его в MainThread или в сетевом потоке?   -  person Kathi    schedule 19.04.2016


Ответы (2)


Возможно, вы ищете FFmpegMediaMetadataRetriever.

Класс FFmpegMediaMetadataRetriever предоставляет унифицированный интерфейс для извлечения кадров и метаданных из входного медиафайла.

Используя константу METADATA_KEY_DURATION в FFmpegMediaMetadataRetriever, вы можете получить продолжительность вашего видео. Он вернет вам строку, после чего вы сможете преобразовать ее в 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");

Из вашего кода.

Надеюсь, это поможет вам. Удачи.

person KishuDroid    schedule 19.04.2016
comment
Я получаю «java.lang.IllegalArgumentException» в «mFFmpegMediaMetadataRetriever .setDataSource (URL-адрес вашего видео);» также, когда я использую 'retriever.setDataSource (URL-адрес вашего видео, новый HashMap‹String, String›());' затем «Время строки = Retriever.extractMetadata (MediaMetadataRetriever.METADATA_KEY_DURATION);» возвращает ноль. Я передаю URL-адрес загрузки хранилища firebase. Может кто-нибудь, пожалуйста, дайте мне знать, как получить продолжительность видео из URL-адреса загрузки хранилища firebase? - person Arjun; 24.06.2019
comment
@Arjun Вы должны указать свой URL-адрес в URL-адресе своего видео .... - person David Lee; 27.07.2020

Это работает для меня (используйте этот код в фоновом потоке, если ваше приложение работает медленно)

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);
    }

}

Делайте в фоновом режиме, используя AsyncTask или сопрограммы, если это медленно

 AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            retriever.setDataSource(model.getLink(), new HashMap<String, String>());
            String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            long timeInMillisec = Long.parseLong(time);
            retriever.release();
            String durations=convertMillieToHMmSs(timeInMillisec); //use this duration
            Log.d("durationns",durations);

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    duration.setText(durations);//set in textview
                }
            });
        }
    });
person Manohar    schedule 15.12.2017
comment
работает отлично, есть ли способ ускорить? потому что это занимает много времени, когда он используется для нескольких видео - person eawedat; 10.09.2018
comment
@eawedat Я не знаю, как это ускорить. - person Manohar; 11.09.2018