【发布时间】: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