reproductor - ¿Qué formato de video se reproducirá en todos los dispositivos Android?
manual de programacion android pdf (3)
Android puede reproducir una variedad de formatos de video , pero debo elegir un formato que funcione en todos los dispositivos.
¿Todos los dispositivos Android 2.3 soportan exactamente los mismos formatos? es decir, si el formato se reproducirá en el emulador, ¿eso significa que también se reproducirá en todo el hardware? ¿O los diferentes dispositivos son compatibles con diferentes formatos dependiendo de qué chips decodificadores tienen?
Si todos son iguales, obviamente el mejor formato es H.264 a una alta tasa de bits y resolución. Si no, ¿cuál es el mejor códec / bitrate / resolución que se reproducirá en el 90% de los dispositivos? ¿Proporciona Google alguna forma de consultar las capacidades de video del dispositivo y elegir un formato adecuado?
Después de probar en muchos dispositivos (para la pantalla de presentación de video de una aplicación muy popular). Mis recomendaciones son:
video codec : H.264
file format: .mp4
video bitrate: 256kbps
video frame/second: 24
Nota: ¡Mi video no tiene sonido!
Pero incluso con esta recomendación, algunos videos no funcionarán debido a su resolución. Así que creo un código complicado: incrusté todos mis videos con toda la densidad en mi carpeta en raw
, agregué un setOnErrorListener
a mi VideoView
e intento lanzar un video más pequeño cada vez que VideoView
un error.
Esta es mi carpeta en bruto:
raw/
splashmdpi.mp4
splashhdpi.mp4
splashxhdpi.mp4
y este es mi código 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)];
}
El emulador es una prueba deficiente de códecs y no funciona en algunas áreas. Y sí, los fabricantes de dispositivos pueden agregar códecs adicionales a su compilación de Android. Sin embargo, es posible que desee revisar la Compatibilidad de Android y leer el Documento de definición de compatibilidad para obtener más detalles sobre lo que requiere el fabricante para obtener Android Market en el dispositivo. Desafortunadamente, un vistazo rápido no indica nada sobre la tasa de bits mínima, por lo que, dependiendo de la antigüedad de la versión de Android que esté dispuesto a admitir, puede tener problemas allí.
http://developer.android.com/guide/appendix/media-formats.html
Creo que puedes usar la clase MediaPlayer para ver capacidades específicas.