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

标签 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 获得.

最佳答案

大小对于 OpenGL ES 之类的东西很重要,你可以在 Surface 上以任何大小绘制它。当您从相机或视频解码器发送数据缓冲区时,缓冲区会以相机或视频给定的大小到达。它会缩放以匹配 SurfaceView 的 View 的大小,但不会缩放以匹配 SurfaceView 的表面的大小。

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

您可以在 this blog post 中阅读有关主要用例的更多信息(演示 here ),更多关于图形架构的信息请参见 this doc .

关于android - 调用SurfaceHolder.setFixedSize()有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38118219/

相关文章:

使用 Wallpaper Manager 的 Android AsyncTask

javascript - 嵌入 Youtube + Facebook 帖子

android - SurfaceView 显示黑屏 - Android

android - 如何正确使用onVisibilityChanged()、onWindowVisibilityChanged()、onAttached/Detached()?

Android 使用 MediaRecorder 从 SURFACEVIEW 录制视频

android - Ionic/Cordova 应用程序测试非常慢

javascript - 在 Chrome devtools 中查看页面加载时发生的 Android webview 网络请求

android - 如何捕获内容提供程序初始化?

bash - 转换 mp3 -> 带有静态图像的视频 (ffmpeg/libav & BASH)

javascript - 如何在js中无间隙地组合多个视频 block ?