【问题标题】:Video aspect ratio is not correct, I set a ratio of 1.333 and the video has 1:1视频长宽比不正确,我设置了1.333的比例,视频有1:1
【发布时间】:2013-08-07 07:42:31
【问题描述】:

我使用 Frame Layout,在其上绑定我的视频播放器,如下所示:

private void initVideoPlayer(View root) {
    mVideoPlayer = new TextureViewVideoPlayer(width, height);
    mVideoPlayer.setOnErrorListener(this);
    mVideoPlayer.setOnPreparedListener(this);
    mVideoPlayer.setOnCompletionListener(this);
    mVideoPlayer.setOnBufferingUpdateListener(this);
    mVideoPlayer.setOnSeekCompleteListener(this);
    mVideoPlayer.setOnVideoSizeChangedListener(this);
    mVideoPlayer.bindView((FrameLayout) root.findViewById(R.id.videoFrame), 0);
}

这是 onVideoSizeChanged 函数,来自 TextureViewVideoPlayer:

@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    Log.i(TAG, "onVideoSizeChanged " + width + " ZZ " + height + " Display Height: " + displayheight + " --- REAL VIDEO RATIO: -- " + ((double) width / (double) height));
    if (this.mOnVideoSizeChangedListener != null)
        this.mOnVideoSizeChangedListener.onVideoSizeChanged(this, width, height);
    if (width == 0 || height == 0) {
        mp.release();
        Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
        return;
    }
    double ratio = ((double) width / (double) height);
    if (displayheight > height) {
        ratio = ((double) displayheight / (double) height);
    } else {
        ratio = ((double) height / (double) displayheight);
    }
    LayoutParams params = new FrameLayout.LayoutParams((int) (width * ratio), (int) (height * ratio));
    // LayoutParams params = new FrameLayout.LayoutParams((width),
    // (height));
    Log.i(TAG, "onVideoSizeChanged mod" + params.width + " ZZ " + params.height + " RATIO: " + ratio + " --- REAL RATIO: -- " + ((double) params.width / (double) params.height));
    params.gravity = Gravity.CENTER;
    mTextureView.setLayoutParams(params);
    this.mTextureView.requestLayout();
}

如您所见,它获取视频的视频宽度和高度,计算比例,然后获取显示高度,并制作比例以查看视频比屏幕大(或小)多少,然后它使用该比率为视频创建参数,并在纹理视图上设置此参数。

在xml中,我绑定播放器的VideoFrame也有这个:

<FrameLayout
    android:id="@+id/videoFrame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" >
</FrameLayout>

现在,如果我保持这样,视频会被拉伸,即使它看起来像一个矩形,视频顶部和底部的一部分也会消失(宽度和高度是 1:1 相同) ,并且高度大于屏幕)。现在,如果我不使用比率,并使用视频的宽度和高度(640 x 480)创建参数,它将是一个小方块。 (比例 1:1),并拉伸。知道如何避免这种情况吗?

PS:我的纹理视图实际上是一个方形纹理视图,它有这个 onMeasure 函数:

 @Override
protected void onMeasure(int paramInt1, int paramInt2) {
    int i = View.MeasureSpec.getSize(paramInt1);
    setMeasuredDimension(i, i);
}

我已经改成:

  @Override
protected void onMeasure(int paramInt1, int paramInt2) {
    int i = View.MeasureSpec.getSize(paramInt1);
    int j = View.MeasureSpec.getSize(paramInt2);
    setMeasuredDimension(i, j);
}

希望这能解决我的问题。

【问题讨论】:

  • 这可能是因为您仅根据高度计算比率,您也应该有一个 ratio2 变量来计算宽度,但与计算高度比率分开(在单独的@ 987654326@ 和当前之外)。
  • 您必须根据屏幕重新计算高度和宽度的比例,因为有时高度可能大于屏幕,但宽度不能大于屏幕,反之亦然。您还必须保持这两个比率之间的比率。
  • 好的,但是如果我不调整大小,我让它成为视频的宽度和高度(它是 640x480),它仍然是平方的,而不是 4:3。这使用原始视频大小。还对调整大小后的宽度和高度做了一个 logcat,它的 1440 x 1080 (4:3) 用于 htc one(全高清)
  • 好吧,如果你有一个 1920x1080 的显示器,那么计算的口粮将是 3,在这种情况下(分辨率 1440x1080),口粮是 2.25,这很奇怪,因为你正在以编程方式执行此操作。我认为您应该首先从布局中删除android:layout_width、android:layout_height 和android:fitsSystemWindows,以免它们混淆计算。您还有其他想法吗? 2.25 的这个比率可能来自哪里?
  • 那不是屏幕比例,是调整视频大小的比例。如果视频的高度是480,屏幕的高度是1080,那么我们必须将视频乘以2.25得到1080。现在我找到了另一个东西,将编辑帖子

标签: android video frame android-video-player textureview


【解决方案1】:

我的纹理视图有这个:

 @Override
protected void onMeasure(int paramInt1, int paramInt2) {
int i = View.MeasureSpec.getSize(paramInt1);
setMeasuredDimension(i, i);

}

为了解决这个问题,我把它改成了:

@Override
protected void onMeasure(int paramInt1, int paramInt2) {
int i = View.MeasureSpec.getSize(paramInt1);
int j = View.MeasureSpec.getSize(paramInt2);
setMeasuredDimension(i, j);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2013-12-19
    • 2013-06-14
    相关资源
    最近更新 更多