¿Android admite el escalado de vídeo?


Usando una VideoView ¿es posible establecer un factor de escala para Android? De forma predeterminada, la vista de vídeo se redimensiona para ajustarse a la resolución codificada del vídeo. ¿Puedo forzar a Android a renderizar un video en un rect más pequeño o más grande?

Author: Jonik, 2010-01-15

7 answers

De forma predeterminada, la vista de vídeo cambia de tamaño para adaptarse a la resolución codificada del Video.

VideoView (o el SurfaceView para usar con MediaPlayer) será el tamaño que le digas que esté en tu diseño. Dentro de ese espacio, el video se reproducirá lo más grande posible manteniendo la relación de aspecto.

Puedo forzar a Android a renderizar un video en un menor o mayor rect?

Sí: haz que tu VideoView sea el tamaño que quieras, y Android escalará para ajustarse al tamaño del VideoView.

 9
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-14 23:25:33

(Sé que es una pregunta muy antigua, pero hay otra forma de controlar las dimensiones, que no se describe aquí, tal vez alguien lo encuentre útil.)

Declare su propia clase MyVideoViewen su diseño y escriba su propio método onMeasure(). Aquí está cómo ejecutar el video estirado a las dimensiones de la vista original:


public class MyVideoView extends VideoView {
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int width = getDefaultSize(0, widthMeasureSpec);
  int height = getDefaultSize(0, heightMeasureSpec);

  setMeasuredDimension(width, height);
 }
}
 56
Author: Michał Kowalczuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-07 16:34:12

Para establecer el tipo de escala "centerCrop" para VideoView sus métodos onMeasure() y layout() pueden tener este aspecto:


public class CenterCropVideoView extends VideoView {
    private int leftAdjustment;
    private int topAdjustment;

 ...
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int videoWidth = getMeasuredWidth();
        int videoHeight = getMeasuredHeight();

        int viewWidth = getDefaultSize(0, widthMeasureSpec);
        int viewHeight = getDefaultSize(0, heightMeasureSpec);

        leftAdjustment = 0;
        topAdjustment = 0;
        if (videoWidth == viewWidth) {
            int newWidth = (int) ((float) videoWidth / videoHeight * viewHeight);
            setMeasuredDimension(newWidth, viewHeight);
            leftAdjustment = -(newWidth - viewWidth) / 2;
        } else {
            int newHeight = (int) ((float) videoHeight / videoWidth * viewWidth);
            setMeasuredDimension(viewWidth, newHeight);
            topAdjustment = -(newHeight - viewHeight) / 2;

        }
    }

    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
    }
}
 10
Author: FeelGood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-18 20:51:34

Encuentro que cuando un VideoView se coloca dentro de un RelativeLayout, el video se extiende ambos altura y anchura para ajustarse a la altura y anchura especificadas de la VideoView (independientemente de la relación de aspecto del vídeo). Sin embargo, cuando coloco la VideoView en un FrameLayout, el video estira la altura y el ancho hasta que coincida uno de la altura o anchura especificada del VideoView (es decir, no rompe la relación de aspecto). Extraño, lo sé, pero eso es lo que encontré!

 9
Author: Adil Hussain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-25 14:06:45

También estoy tratando de lograr eso y hasta ahora esto ha funcionado bien. La idea es utilizar setLayoutParams para la vista de vídeo y especificar el tamaño. Es solo un simple fragmento pero da la idea. Compruebe las líneas de LayoutParams.

VideoView mVideoView = new VideoView(this);

//intermediate code

mVideoView.setVideoPath("/sdcard/VIDEO0007.3gp");
MediaController mController = new MediaController(this);
mVideoView.setMediaController(mController);
mController.setOnTouchListener(new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {
    int width = mVideoView.getMeasuredWidth();
    int height = mVideoView.getMeasuredHeight();
    //we add 10 pixels to the current size of the video view every time you touch     
    //the media controller.
    LayoutParams params = new LinearLayout.LayoutParams(width+10, height+10);
    mVideoView.setLayoutParams(params);

    return true;
}
});

mVideoView.requestFocus();
mVideoView.start();
 3
Author: silver_mx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-25 16:24:35

A FeelGoods respuesta.

Sin el método layout() el tipo de escala "centerCrop" es mejor, pero el VideoView debe estar en un FrameLayout.

@Override
public void layout(int l, int t, int r, int b) {
    super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
 2
Author: Joao Ferreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-18 16:31:48

Chicos que tenía otra idea crear su propia clase VideoView extendiendo VideoView, con que u puede hacer lo que quiera u,. exactamente u tiene que crear un par de métodos en su VideoView.

public void setDimensions(int w, int h) {
    this.mForceHeight = h;
    this.mForceWidth = w;

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(mForceWidth, mForceHeight);
}

Haga su propio constructor para ur clase VideoView y asegúrese de que estos métodos en ur propia clase videoview luego usarlo como como androids predeterminado videoview en archivos xml y de clase.

Espero que ayude.

 0
Author: Murali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-09 11:01:12