Sto riproducendo video dal mio server in superficie utilizzando la visualizzazione texture, ma il suo allungamento del video e l'impossibilità di mantenere le proporzioni del video. Ma, vorrei mantenere le proporzioni come per il video come in app di vite o instagram.Riproduzione di video in visualizzazione struttura con proporzioni del video
risposta
È possibile modificare la dimensione della vista (utilizzando un FrameLayout personalizzato) oppure utilizzare la matrice TextureView per modificare il modo in cui la texture viene renderizzata.
Esempi di entrambi possono essere trovati in Grafika. L'attività "Riproduci video (TextureView)" dimostra la configurazione della matrice in modo che corrisponda alle proporzioni di un video. Vedere il metodo adjustAspectRatio()
, il cui nucleo è:
Matrix txform = new Matrix();
mTextureView.getTransform(txform);
txform.setScale((float) newWidth/viewWidth, (float) newHeight/viewHeight);
txform.postTranslate(xoff, yoff);
mTextureView.setTransform(txform);
Nota centra così come in scala del video.
È possibile utilizzare ExoPlayer https://github.com/google/ExoPlayer# e controllare la demo completa. Mantiene perfettamente le proporzioni del video.
Ampliando la risposta di Fadden sopra: Se si desidera allineare il video in un altro modo diverso da solo centrarla, modificare queste linee in "adjustAspectRatio) (" Codice del Grafika:
int xoff = (viewWidth - newWidth)/2;
int yoff = (viewHeight - newHeight)/2;
a:
int xoff = 0; //align left
o
int xoff = (viewWidth - newWidth); // align right
o
int yoff = 0; // align top
o
int yoff = (viewHeight - newHeight); // align bottom
Beh io sono troppo tardi per rispondere, ma come ho avuto da Grafika è possibile utilizzare questa funzione
private void adjustAspectRatio(int videoWidth, int videoHeight) {
int viewWidth = mTextureView.getWidth();
int viewHeight = mTextureView.getHeight();
double aspectRatio = (double) videoHeight/videoWidth;
int newWidth, newHeight;
if (viewHeight > (int) (viewWidth * aspectRatio)) {
// limited by narrow width; restrict height
newWidth = viewWidth;
newHeight = (int) (viewWidth * aspectRatio);
} else {
// limited by short height; restrict width
newWidth = (int) (viewHeight/aspectRatio);
newHeight = viewHeight;
}
int xoff = (viewWidth - newWidth)/2;
int yoff = (viewHeight - newHeight)/2;
Log.v(TAG, "video=" + videoWidth + "x" + videoHeight +
" view=" + viewWidth + "x" + viewHeight +
" newView=" + newWidth + "x" + newHeight +
" off=" + xoff + "," + yoff);
Matrix txform = new Matrix();
mTextureView.getTransform(txform);
txform.setScale((float) newWidth/viewWidth, (float) newHeight/viewHeight);
//txform.postRotate(10); // just for fun
txform.postTranslate(xoff, yoff);
mTextureView.setTransform(txform);
}
è possibile utilizzare con exoplayer –
@Sagar Hudge sì, certo che puoi usare exolplayer per riprodurre video, questa domanda è per coloro che non usano alcuna libreria di terze parti per riprodurre video –
Voglio riprodurre video a schermo intero in verticale ma si estendono verticalmente sul ridimensionamento 'FILL', voglio riempire e centro coltura –
@fadden si prega di controllare questa domanda https://stackoverflow.com/questions/48988063/how-can-i-scale-video-in-exoplayer-v2-play-video-in-full-screen utilizzando expoplayer è possibile effettuare la scansione nel centro –