Какая польза от вызова SurfaceHolder.setFixedSize()?
У меня есть подобный код для многих примеров, плавающих в сети:
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);
}
Исходя из этого кода, я ожидаю, что поверхность видео будет установлена на крошечный размер 20x10 пикселей, а затем уменьшена до любого размера макета, который я использую, показывая пиксельную / размытую версию. Однако воспроизводимое видео выглядит правильно в полном родном разрешении, оно не уменьшается до 20х10. Но я получаю журналы, подобные этим:
SurfaceChanged to -2 width 20 height 10
Так что, если поверхность видео установлена на этот крошечный размер, но графически видео все еще выглядит в высоком разрешении, какая польза от установки размера поверхности?
Полный исходный код доступен по адресу https://github.com/gradha/Stackru38118219.
1 ответ
Размер имеет значение для таких вещей, как OpenGL ES, где вы рисуете на поверхности в любом размере. Когда вы отправляете буферы данных с камеры или видеодекодера, буферы достигают того размера, который они дали камере или видео. Он масштабируется в соответствии с размером представления SurfaceView, но не масштабируется в соответствии с размером SurfaceView.
Единственное место, где эти две концепции пересекаются, - это API предварительного просмотра Camera2, который, по-видимому, изменит размер своего захвата, чтобы в некоторых случаях соответствовать поверхности.
Вы можете прочитать больше о первичном сценарии использования в этом сообщении в блоге (демо здесь) и больше о графической архитектуре в целом в этом документе.