¡Acostúmbrate a escribir juntos! Este es el tercer día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .
prefacio
Después de usar la MediaPlayer
capacidad de reproducción, hay otro problema que debe resolverse en la reproducción de video, es decir, la adaptación del tamaño. De manera predeterminada, SurfaceView
la reproducción de video puede hacer que el video se estire o comprima.
Solución interna MediaPlayer
La información de recursos de video es la siguiente, el tamaño del video es 1080x606
y la situación de reproducción normal es que el ancho es mayor que la pantalla de altura.
juego normal | información de vídeo |
---|---|
MediaPlayer
Soporte interno para la configuración del tamaño de reproducción de video: VIDEO_SCALING_MODE_SCALE_TO_FIT
y VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
, establecido por setVideoScalingMode
método. Las dos formas se muestran en la siguiente figura.
VIDEO_ESCALAMIENTO_MODO_ESCALA_PARA_AJUSTAR | VIDEO_ESCALAMIENTO_MODO_ESCALA_PARA_AJUSTAR_CON_RECORTE |
---|---|
Sin embargo, se muestra el efecto real y para lograr el efecto esperado, es necesario modificar el tamaño de la ventana para lograr la adaptación del tamaño previo.
Esquema de adaptación
El diseño del algoritmo en el esquema de adaptación debe ser tal que un lado del ancho y alto del video llene la pantalla (porque otras situaciones no se consideran por el momento), y el valor predeterminado se basa en el tamaño de la pantalla. Aquí también tome la pantalla vertical como ejemplo, y la pantalla horizontal es en realidad la misma solución.
Está prediseñado para que la pantalla vertical de la pantalla tenga el ancho completo, calcule la relación de aspecto de la pantalla y use la relación de aspecto de la pantalla después de obtener el tamaño del video. Tome el ancho de la pantalla como el ancho después de escalar el tamaño del video y luego calcule la altura después de escalar el tamaño del video. El tamaño final calculado no es el tamaño de la SurfaceView
ventana de visualización, lo que garantiza que el tamaño del video en reproducción se estire.
sección de código
La información del tamaño del video se puede MediaPlayer
obtener después de la preparación de la carga de recursos de video. Recuerde que mencioné antes que getTrackInfo()
el tamaño del video no se puede obtener y no es necesario MediaExtractor
realizarlo, de hecho, MediaPlayer
la información del video se puede obtener directamente después de que esté listo.
@Override
public void onPrepared(MediaPlayer mp) {
playerInfo.playerStatus = PREPARED;
//获取到的资源不够查询详细数据
int width = mp.getVideoWidth();
int height = mp.getVideoHeight();
playerInfo.videoSize = new Size(width,height);
callbackInfo(playerInfo);
}
复制代码
Una vez que el recurso está listo, el tamaño de la pantalla se obtiene en la devolución de llamada y luego el algoritmo calcula el tamaño de la ventana para lograr la adaptación del tamaño del video.
@Override
public void onPlayerInfoCallBack(AndroidMediaPlayer.PlayerInfo playerInfo) {
if(playerInfo.getPlayerStatus() == AndroidMediaPlayer.PREPARED){
//屏幕比例
Size size = ScreenUtils.getScreenSize(TestSimpleMediaPlayerActivity.this);
//以宽为主
Size videoSize = playerInfo.getVideoSize();
//视频比例
float videoRatio = videoSize.getWidth() / (float)videoSize.getHeight();
float newHeight = size.getWidth() / videoRatio;
LinearLayout.LayoutParams layoutParams =(LinearLayout.LayoutParams) surfaceView.getLayoutParams();
layoutParams.height = (int)newHeight;
// 重新设置窗口尺寸高
surfaceView.setLayoutParams(layoutParams);
androidMediaPlayer.start();
}
}
复制代码
Resumir
De hecho, el tamaño de la ventana de reproducción de video se puede configurar cambiando el tamaño final de la ventana de reproducción. Por supuesto, puede adaptar el tamaño de la ventana sin usar el tamaño de la pantalla como punto de referencia. Por ejemplo, la SurfaceView
ventana de diseño externo es un cuadrado, etc. También se puede lograr, pero el efecto de visualización puede no ser muy bueno. En segundo lugar, si el tamaño del video está escalado y recortado internamente (16:9, 3:4), es posible que se requieran otras soluciones.