Série de desenvolvimento de áudio e vídeo Android - Adaptação do tamanho da janela de vídeo do MediaPlayer

Crie o hábito de escrever juntos! Este é o terceiro dia da minha participação no "Nuggets Daily New Plan · April Update Challenge", clique para ver os detalhes do evento .

prefácio

Depois de usar o MediaPlayerrecurso de reprodução, há outro problema que precisa ser resolvido na reprodução de vídeo, ou seja, a adaptação do tamanho da adaptação. Por padrão, a SurfaceViewreprodução de vídeo pode fazer com que o vídeo seja esticado ou compactado.

Solução interna MediaPlayer

As informações do recurso de vídeo são as seguintes, o tamanho do vídeo é 1080x606, e a situação de reprodução normal é que a largura é maior que a altura exibida.

Jogo normal informações de vídeo
7943e6f265e50978628e70c99effa919.jpg 9f8313a8b9c837f2c21730a12fb10e5e.jpg

MediaPlayerSuporte interno para configuração de tamanho de reprodução de vídeo: VIDEO_SCALING_MODE_SCALE_TO_FITe VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING, definido por setVideoScalingModemétodo. As duas maneiras são mostradas na figura abaixo.

VIDEO_SCALING_MODE_SCALE_TO_FIT VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
4dc6ed9459f9b2cb73a900fd6bed5c6d.jpg a2b43b3ddb489f0484dfc3a5e7b26aba.jpg

No entanto, o efeito real é exibido e, para obter o efeito esperado, é necessário modificar o tamanho da janela para obter a adaptação de pré-dimensionamento.

Esquema de adaptação

O projeto do algoritmo no esquema de adaptação deve ser tal que um lado da largura e altura do vídeo preencha a tela (porque outras situações não são consideradas no momento), e o padrão é baseado no tamanho da tela. Aqui também tome a tela vertical como exemplo, e a tela horizontal é na verdade a mesma solução.

É pré-projetado que a tela vertical da tela precisa ter largura total, calcular a proporção da tela e usar a proporção da tela após obter o tamanho do vídeo. Pegue a largura da tela como a largura após dimensionar o tamanho do vídeo e, em seguida, calcule a altura após dimensionar o tamanho do vídeo. O tamanho final calculado não é o tamanho da SurfaceViewjanela de visualização, o que garante que o tamanho do vídeo reproduzido seja esticado.

80ccc37a3e1f6ea9468ec7ea80837c3.jpg

seção de código

As informações sobre o tamanho do vídeo podem ser MediaPlayerobtidas após a preparação do carregamento dos recursos de vídeo. Lembre-se que eu mencionei antes que getTrackInfo()o tamanho do vídeo não pode ser obtido, e não precisa MediaExtractorser percebido, na verdade, MediaPlayeras informações do vídeo podem ser obtidas diretamente depois que ele estiver pronto.

 @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);
    }
复制代码

Após o recurso estar pronto, o tamanho da tela é obtido no callback, e então o algoritmo calcula o tamanho da janela para conseguir a adaptação do tamanho do vídeo.

@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

Na verdade, o tamanho da janela de reprodução de vídeo pode ser definido alterando o tamanho final da janela de reprodução. Claro, você pode adaptar o tamanho da janela sem usar o tamanho da tela como referência. Por exemplo, a SurfaceViewjanela de layout externo é um quadrado, etc. Isso também pode ser alcançado, mas o efeito de exibição pode não ser muito bom. Em segundo lugar, se o tamanho do vídeo for dimensionado e cortado internamente (16:9, 3:4), outras soluções podem ser necessárias.

Acho que você gosta

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