Serie de desarrollo de audio y video de Android: adaptación del tamaño de la ventana de video de MediaPlayer

¡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 MediaPlayercapacidad 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, SurfaceViewla 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 1080x606y 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
7943e6f265e50978628e70c99effa919.jpg 9f8313a8b9c837f2c21730a12fb10e5e.jpg

MediaPlayerSoporte interno para la configuración del tamaño de reproducción de video: VIDEO_SCALING_MODE_SCALE_TO_FITy VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING, establecido por setVideoScalingModemétodo. Las dos formas se muestran en la siguiente figura.

VIDEO_ESCALAMIENTO_MODO_ESCALA_PARA_AJUSTAR VIDEO_ESCALAMIENTO_MODO_ESCALA_PARA_AJUSTAR_CON_RECORTE
4dc6ed9459f9b2cb73a900fd6bed5c6d.jpg a2b43b3ddb489f0484dfc3a5e7b26aba.jpg

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 SurfaceViewventana de visualización, lo que garantiza que el tamaño del video en reproducción se estire.

80ccc37a3e1f6ea9468ec7ea80837c3.jpg

sección de código

La información del tamaño del video se puede MediaPlayerobtener 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 MediaExtractorrealizarlo, de hecho, MediaPlayerla 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 SurfaceViewventana 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.

Supongo que te gusta

Origin juejin.im/post/7084866365487579166
Recomendado
Clasificación