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 MediaPlayer
recurso 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 SurfaceView
reproduçã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 |
---|---|
MediaPlayer
Suporte interno para configuração de tamanho de reprodução de vídeo: VIDEO_SCALING_MODE_SCALE_TO_FIT
e VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
, definido por setVideoScalingMode
método. As duas maneiras são mostradas na figura abaixo.
VIDEO_SCALING_MODE_SCALE_TO_FIT | VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING |
---|---|
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 SurfaceView
janela de visualização, o que garante que o tamanho do vídeo reproduzido seja esticado.
seção de código
As informações sobre o tamanho do vídeo podem ser MediaPlayer
obtidas 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 MediaExtractor
ser percebido, na verdade, MediaPlayer
as 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 SurfaceView
janela 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.