Android是否支持缩放视频?

时间:2010-01-14 23:10:32

标签: android video android-videoview

使用VideoView可以为Android设置比例因子吗?默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。我可以强制Android将视频渲染为更小或更大的矩形吗?

7 个答案:

答案 0 :(得分:56)

(我知道这是一个非常古老的问题,但还有另一种控制尺寸的方法,这里没有描述,也许有人会发现它有用。)

在布局中声明自己的 MyVideoView 类,并编写自己的 onMeasure()方法。以下是如何将视频拉伸到原始视图的尺寸:


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);
 }
}

答案 1 :(得分:10)

我发现当VideoView放在RelativeLayout中时,视频会拉伸 高度和宽度,以适应VideoView指定的高度和宽度(无论视频方面如何)比)。但是,当我将VideoView放在FrameLayout中时,视频会拉伸高度和宽度,直到它匹配 之一的VideoView指定的高度或宽度(即它不会打破宽高比) )。奇怪,我知道,但这就是我找到的!

答案 2 :(得分:10)

要为"centerCrop"设置VideoView缩放类型,您的onMeasure()layout()方法可能如下所示:


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);
    }
}

答案 3 :(得分:9)

  

默认情况下,视频视图会调整大小   本身适合编码的分辨率   视频。

VideoView(或SurfaceView用于MediaPlayer)将是您在布局中告诉它的大小。 在该空间内,视频将在保持宽高比的同时尽可能大地播放。

  

我可以强制Android渲染视频吗?   进入一个更小或更大的矩形?

是的:让您的VideoView达到您想要的尺寸,Android会缩放到适合VideoView的尺寸。

答案 4 :(得分:3)

我也在努力实现这一点,到目前为止,这已经成功了。我们的想法是使用setLayoutParams作为视频视图并指定大小。它只是一个简单的片段,但它给出了这个想法。检查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();

答案 5 :(得分:2)

FeelGoods 回答。

如果没有layout()方法,“ centerCrop”比例类型会更好,但VideoView必须位于FrameLayout中。

@Override
public void layout(int l, int t, int r, int b) {
    super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}

答案 6 :(得分:0)

伙计我有其他想法通过扩展VideoView创建自己的VideoView类,你可以做任何你想做的事情。你必须在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);
}

为你的VideoView类制作你自己的构造函数,并确保你自己的videoview类中的这些方法然后将它用作xro和类文件中的androids默认videoview。

希望它有所帮助。