2014-12-19 14 views
12

Próbuję uzyskać rozmiar zdalnego wideo przy użyciu tej klasy i otrzymuję IllegalArgumentException, jeśli wideo jest zdalne.MediaMetadataRetriever setDataSource wyrzuca IllegalArgumentException

wideo MP4 jest przechowywany w jednym serwerze ...

film odtwarza poprawnie jeśli zagram go z MediaPlayer, ale daje błąd, gdy próbuję to zrobić:

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

błąd zostanie rzucony w tej linii:

retriever.setDataSource(context, uri); 

i uri zawiera Uri.parse("http://www.myweb.com/myvideo.mp4");

co jest nie tak w kodzie?

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

Czy rozwiązałeś ten problem? – ClassA

Odpowiedz

15

Być może napotkasz błąd this. Jeśli tak, spróbuj:

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

Jeśli to nie zadziała, zawsze możesz spróbować 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

Metoda setDataSource (String) w typie MediaMetadataRetriever nie ma zastosowania do argumentów (String, HashMap ) – NullPointerException

+0

, a także FFmpegMediaMetadataRetriever potrzebuje 20 mbajtów przestrzeni .... – NullPointerException

+0

Podpis metody tutaj: http: // developer .android.com/reference/android/media/MediaMetadataRetriever.html # setDataSource% 28java.lang.String,% 20java.util.Map% 3Cjava.lang.String,% 20java.lang.String% 3E% 29 –

1

W moim przypadku było stworzenie prostego ekstrakcji metadanych testową aplikację, więc skopiowałem plik do mój telefon przy użyciu adb, tak:

adb push 350950598.mp4 /sdcard/Movies 

ale zapomniałem dodać uprawnienia do odczytu katalogu pamięci zewnętrznej w pliku manifestu aplikacji.

Konkretnie:

<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> 

Dodanie tych uprawnień ustalone to dla mnie, nawet dla prostego połączenia ciąg Plik:

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

I oczywiście, jeśli jesteś kierowania API 23+ marshmallow następnie będziesz musiał dynamicznie prosić o te uprawnienia.

Powiązane problemy