2014-12-19 15 views
12

Sto cercando di ottenere la dimensione di un video remoto utilizzando questa classe e sto ricevendo IllegalArgumentException se il video è remoto.MediaMetadataRetriever setDataSource genera IllegalArgumentException

il video è un mp4 memorizzato in un server ...

il video viene riprodotto correttamente se gioco con mediaplayer, ma dà l'errore se provo a fare questo:

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

l'errore è gettato in questa linea:

retriever.setDataSource(context, uri); 

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

cosa c'è di sbagliato nel codice?

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

Hai risolto questo problema? – ClassA

risposta

15

Forse si sta imbattendo in bug this. Se quindi cercate:

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

Se questo non funziona si può sempre provare 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

Il metodo setDataSource (String) nel tipo MediaMetadataRetriever non è applicabile per gli argomenti (String, HashMap ) – NullPointerException

+0

e anche FFmpegMediaMetadataRetriever richiede 20 mbyte di spazio .... – NullPointerException

+0

Firma del metodo qui: 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

Nel mio caso, stavo creando una semplice estrazione di metadati Test App, così ho copiato un file da il mio telefono utilizzando adb, in questo modo:

adb push 350950598.mp4 /sdcard/Movies 

ma ho dimenticato di aggiungere la directory il permesso di memorizzazione esterna di leggere nel manifesto app.

In particolare:

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

Aggiunta di tali autorizzazioni fissata per me, anche per la semplice chiamata stringa di file:

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

E, naturalmente, se ci si rivolge API 23+ marshmallow poi dovrai chiedere in modo dinamico anche queste autorizzazioni.

Problemi correlati