Android peut lire un variété de formats vidéo , mais je dois choisir un format qui fonctionnera sur tous les appareils.
Tous les appareils Android 2.3 prennent-ils en charge exactement les mêmes formats? Par exemple, si le format est lu dans l'émulateur, cela signifie-t-il qu'il peut également être lu sur tout le matériel? Ou est-ce que différents appareils prennent en charge différents formats en fonction de quelles puces de décodeur ils ont?
S'ils sont tous identiques, le meilleur format est évidemment le H.264 à un débit et une résolution élevés. Sinon, quel est le meilleur codec/débit/résolution qui pourra être lu sur 90% des appareils? Google propose-t-il un moyen d'interroger les capacités vidéo de l'appareil et de choisir un format approprié?
L'émulateur est un mauvais test des codecs et n'est pas fonctionnel dans quelques domaines. Et oui, les fabricants d'appareils peuvent ajouter des codecs supplémentaires à leur version d'Android. Cependant, vous voudrez peut-être consulter Compatibilité Android et lire le document de définition de compatibilité pour plus de détails sur ce qui est requis par le fabricant, obtenez Android Market sur l'appareil. Malheureusement, un coup d'œil rapide ne dit rien sur le débit minimum, donc selon l'âge d'une version de Android que vous êtes prêt à soutenir, vous pouvez avoir des problèmes là-bas.
Après avoir testé sur de nombreux appareils (pour l'écran de démarrage vidéo d'une application très populaire). Mes recommandations sont:
video codec : H.264
file format: .mp4
video bitrate: 256kbps
video frame/second: 24
Remarque: Ma vidéo n'a pas de son !!
Mais même avec cette recommandation, certaines vidéos ne fonctionneront pas en raison de sa résolution. Je crée donc un code délicat: j'incorpore toutes mes vidéos pour toute la densité dans mon dossier raw
, j'ajoute un setOnErrorListener
à mon VideoView
et j'essaie de lancer une vidéo plus petite chaque fois qu'une erreur s'est produite.
Voici mon dossier brut:
raw/
splashmdpi.mp4
splashhdpi.mp4
splashxhdpi.mp4
et voici mon Java:
int densityoffset = 0;
VideoView video = new VideoView(this);
video.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video.start();
}
}
video.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
densityoffset++;
String suff = getDensitySuffix(getContext(), densityoffset);
video.setVideoPath("Android.resource://com.example.packagename/raw/splash"+suff);
if(offset>5)
return false;
else
return true;
}
});
String suff = getDensitySuffix(this,offset);
video.setVideoPath("Android.resource://com.example.packagename/raw/splash"+suff);
private String suffix[]={"ldpi","mdpi","hdpi","xhdpi"};
/**
*Return the suffix concerning your device less offset value
**/
private String getDensitySuffix(Context ctx, int offset){
int dens = 2;
int d = getContext().getResources().getDisplayMetrics().densityDpi
if(d==DisplayMetrics.DENSITY_LOW)
dens = 0;
else
if(d==DisplayMetrics.DENSITY_MEDIUM)
dens = 1;
else
if(d==DisplayMetrics.DENSITY_HIGH))
dens = 2;
else
if(d==DisplayMetrics.DENSITY_XHIGH))
dens = 3;
return suffix[Math.max(0, dens-offset)];
}
http://developer.Android.com/guide/appendix/media-formats.html
Je pense que vous pouvez utiliser la classe MediaPlayer pour voir des capacités spécifiques.