2014-12-19 3 views
12

Я пытаюсь получить размер удаленного видео с помощью этого класса, и я получаю исключение IllegalArgumentException, если видео является удаленным.MediaMetadataRetriever setDataSource throws IllegalArgumentException

видео является mp4 хранится в одном сервере ...

видео воспроизводится правильно, если я играть с медиаплеера, но он дает ошибку, если я пытаюсь сделать это:

try { 
    MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
    Bitmap bmp = null;  
    retriever.setDataSource(context, uri); 
    bmp = retriever.getFrameAtTime();   
    videoHeight = (int) (bmp.getHeight()*((float)getIntWidth()/bmp.getWidth())); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

ошибка генерируется в этой строке:

retriever.setDataSource(context, uri); 

Ури содержит Uri.parse("http://www.myweb.com/myvideo.mp4");

что не так в коде?

12-19 13:38:08.610: W/System.err(13333): java.lang.IllegalArgumentException 
12-19 13:38:08.611: W/System.err(13333): at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:175) 
+0

Вы решили эту проблему? – ClassA

ответ

15

Возможно, вы столкнулись с ошибкой this. Если это так попробовать:

try { 
    MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
    Bitmap bmp = null;  
    retriever.setDataSource("http://www.myweb.com/myvideo.mp4", new HashMap<String, String>()); 
    bmp = retriever.getFrameAtTime();   
    videoHeight = (int) (bmp.getHeight()*((float)getIntWidth()/bmp.getWidth())); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Если это не работает, вы всегда можете попробовать FFmpegMediaMetadataRetriever:

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever(); 

try { 
    Bitmap bmp = null;  
    retriever.setDataSource("http://www.myweb.com/myvideo.mp4")); 
    bmp = retriever.getFrameAtTime();   
    videoHeight = (int) (bmp.getHeight()*((float)getIntWidth()/bmp.getWidth())); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

retriever.release(); 
+0

Метод setDataSource (String) в типе MediaMetadataRetriever не применим для аргументов (String, HashMap ) – NullPointerException

+0

, а также FFmpegMediaMetadataRetriever требуется 20 мегабайт пространства .... – NullPointerException

+0

Подпись метода здесь: http: // разработчик .android.com/reference/android/media/MediaMetadataRetriever.html # setDataSource% 28java.lang.String,% 20java.util.Map% 3Cjava.lang.String,% 20java.lang.String% 3E% 29 –

1

В моем случае, я создавал простое извлечение метаданных тестовое приложение, поэтому я скопировал файл мой телефон с помощью ADB, например, так:

adb push 350950598.mp4 /sdcard/Movies 

но я забыл добавить разрешения для чтения каталога внешнего хранения данных в приложении манифесте.

В частности:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.cool.package.name"> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    ... 
</manifest> 

Добавление этих разрешений установил ее для меня, даже для простой строки файла вызова:

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); 
    mediaMetadataRetriever.setDataSource(movie.getPath()); 

И, конечно же, если вы ориентации API 23+ зефир затем вам также придется динамически запрашивать эти разрешения.

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