调用SurfaceHolder.setFixedSize()有什么用?

时间:2016-06-30 08:50:38

标签: android video surfaceview surfaceholder

我在网上浮动的许多例子都有类似的代码:

mSurfaceHolder = mVideoSurface.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setFormat(PixelFormat.TRANSPARENT);
mSurfaceHolder.setFixedSize(20, 10);

然后在我的回调中:

@Override public void surfaceCreated(SurfaceHolder holder)
{
    Log.d(TAG, "SurfaceCreated");
    mSurfaceHolder.setFixedSize(20, 10);
}

@Override public void surfaceChanged(
    SurfaceHolder holder, int format, int width, int height
)
{
    Log.d(TAG, "SurfaceChanged to " +
        format + " width " + width + " height " + height);
}

从这段代码我可以看到视频表面to be set to the tiny size of 20x10 pixels,然后缩小到我正在使用它的任何布局大小,显示像素化/模糊版本。但是,正在播放的视频在其完整的原始分辨率下看起来是正确的,它不会缩小到20x10。但我得到这样的日志:

SurfaceChanged to -2 width 20 height 10

因此,如果视频表面设置为这么小的尺寸,但从图形上看,视频看起来仍然很高,那么设置表面尺寸有什么用呢?

https://github.com/gradha/Stackoverflow38118219提供的完整源代码。

1 个答案:

答案 0 :(得分:7)

尺寸对于像OpenGL ES这样的东西很重要,你可以在Surface上以任何大小绘制它。当您从相机或视频解码器发送数据缓冲区时,缓冲区将达到相机或视频给出的任何大小。它的缩放与SurfaceView视图的大小相匹配,但它没有缩放以匹配SurfaceView的Surface的大小。

两个概念交叉的地方是Camera2预览API,在某些情况下,它显然会调整其捕捉大小以匹配Surface。

您可以在this blog post(演示here)中详细了解主要用例,以及this doc中有关整体图形架构的更多信息。