【问题标题】:Does Android support scaling Video?Android 是否支持缩放视频?
【发布时间】:2016-03-19 00:31:48
【问题描述】:

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

【问题讨论】:

    标签: android video android-videoview


    【解决方案1】:

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

    在你的布局中声明你自己的 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);
     }
    }
    

    【讨论】:

    • 漂亮干净的解决方案,也是这里唯一真正有效的解决方案。
    • Dint 为我工作,我有 720 * 480 的视频,我正试图在方形视图上显示它,视频长度被“压扁”
    【解决方案2】:

    要为VideoView 设置"centerCrop" 比例类型,您的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);
        }
    }
    

    【讨论】:

    • 我遇到了这个问题,尝试播放视频时,VideoView 是先缩放宽度,然后获得 leftAdjustment,然后是高度,所以原来的 leftAdjustment 设置为 0 我解决了它,删除了初始化类 private int leftAdjustment = 0 的变量;私人int topAdjustment = 0;并删除 leftAdjustment = 0;顶部调整 = 0;从方法内部感谢您的解决方案,这是一种无需使用 TextureView API 14 和失去兼容性即可裁剪视频的好方法
    • 您应该将布局方法行更改为 super.layout(l + leftAdjustment, t + topAdjustment, r - leftAdjustment, b - topAdjustment); 。否则它只会移动你的vidoView,但不会改变它的大小
    • 我认为缩放是通过 onMeasure() 中的 setMeasuredDimension() 实现的。我在 play.google.com/store/apps/details?id=ru.zenrus.android 中使用了该代码,并且成功了。你检查过你的建议了吗?
    • 这对我不起作用。我的VideoView 只占屏幕的一半,我需要缩放视频,但这个解决方案只是最大化视图,而不是裁剪视频
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      我可以强制 Android 渲染视频吗 变成更小还是更大的矩形?

      是的:将您的VideoView 设置为您想要的大小,Android 将缩放以适应VideoView 的大小。

      【讨论】:

      • 太棒了,你知道打破纵横比的方法吗?
      • 我应该补充一点,并非所有平台实际上都正确执行此操作。例如,Droid Eris 似乎将视频缩放到其原始分辨率,从而扩展视频视图。平台碎片啊!
      • 我进一步发现,我可以打破视频视图的纵横比。我只需要等待视频开始,一旦视频视图重新调整大小,我就可以进入并使用布局调整视图大小。那时,我可以给它任何尺寸,它会拉伸到所需的高度/宽度。
      • @haseman:我发现带有 2.1 的 HTC Desire 也无法缩放视频(至少使用我正在使用的当前代码),但在 Nexus One 等所有其他设备上运行良好,三星 Galaxy S 等 - 都在 2.1 上运行。
      【解决方案5】:

      我也在努力实现这一目标,到目前为止,这一切正常。这个想法是为视频视图使用 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();
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          伙计们,我有其他想法,通过扩展 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 类中使用此方法,然后将其用作 android 的默认 videoview 到 xml 和类文件中。

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多