2013-07-13 5 views
2

Я пытаюсь использовать Android MediaMetadataRetriever, чтобы получить длину recoreded видео в формате mp4 - но я получаю исключение:Android MediaMetadataRetriever setDataSource удалось

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 

Я не знаю, что я делаю неправильно - кто-нибудь поможет мне, пожалуйста! Также этот код отлично работает для аудиофайлов, но не для видео.

+0

MediaMetadataRetriever, вероятно, просто не может прочитать этот конкретный видеофайл по любой причине. Вы пробовали https://github.com/wseemann/FFmpegMediaMetadataRetriever? –

+0

он не может прочитать каждый файл, который я даю ему, записанный с моей камеры .... так что нет - не тестировал библиотеку, но, возможно, проверит ее позже - спасибо заранее –

+0

Что я говорю, проблема может быть связанными с кодеком, который использует камера, или как он записывает метаданные. Кроме того, можете ли вы разместить образец файла? –

ответ

1

Удалить файл: // с видео URI перед передачей его setDataSource способ.

2
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(); 
     } 
     return result; 
    } 
+0

Всегда отключайте ретривер и закрывайте входной поток после его выполнения. – kAmol

Смежные вопросы