我有许多类似的代码漂浮在网上:
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找到。
最佳答案
大小对于像opengl es这样的东西很重要,在那里你可以在任何大小的表面上画画。当你从摄像机或视频解码器发送数据缓冲区时,缓冲区达到摄像机或视频给定的任何大小。它会缩放以匹配SurfaceView视图的大小,但不会缩放以匹配SurfaceView曲面的大小。
这两个概念交叉的一个地方是camera2预览api,在某些情况下,它显然会调整捕获的大小以匹配曲面。
您可以在this blog post(demohere)中阅读有关主要用例的更多信息,并在this doc中阅读有关图形体系结构整体的更多信息。