【问题标题】:Copy from one surface to another surface从一个表面复制到另一个表面
【发布时间】:2021-11-08 10:52:55
【问题描述】:

我目前有两个不同的表面(一个来自 SurfaceView,另一个来自 MediaCodec)。

从一个表面复制到另一个表面有哪些不同的方法?

【问题讨论】:

  • 您能详细介绍一下您的用例吗?您是否尝试同时显示和编码视频?
  • 我打算从另一个表面复制数据并将其传递给 MediaCodec 的持久输入表面
  • Surface 是媒体缓冲区的消费者,但在您的情况下谁是生产者?
  • Source => Surface View , Destination => Surface 创建自 MediaCodec.CreatePersistentInputSurface();
  • 流程中缺少某些内容。 SurfaceView 不产生框架,它提供了一个 Surface 供其他人绘制。

标签: android surfaceview android-mediacodec android-graphics


【解决方案1】:

在 Android 图形架构中,Surface 扮演包含图形数据(例如视频帧)的缓冲区消费者的角色。

典型的消费者不提供对其持有的缓冲区的访问。一个例外是特殊类型ImageReader,它允许应用程序直接访问渲染到其Surface 中的图像数据。

使用PixelCopySurfaceView 的内容复制到Bitmap 的效率较低。而TextureView 允许您直接获取Bitmap

然后您可以使用CanvasBitmap 图像绘制到另一个Surface 上。

链接:

https://source.android.com/devices/graphics/arch-sh

https://developer.android.com/reference/android/media/ImageReader

https://developer.android.com/reference/android/view/PixelCopy

https://developer.android.com/reference/android/view/Surface#lockCanvas(android.graphics.Rect)

https://developer.android.com/reference/android/graphics/Canvas#drawBitmap(android.graphics.Bitmap,%20android.graphics.Rect,%20android.graphics.Rect,%20android.graphics.Paint)

【讨论】:

  • 如果我有一个表面,是否可以附加到 SurfaceView 或任何绘图处理程序?
  • 在幕后,Surface 与缓冲区队列一起工作。它必须在使用缓冲区后将缓冲区释放回队列。如果一个 Surface 将连接到两个不同的对象,它如何知道两个对象都已处理完当前缓冲区?
  • 好的,如果我将一些内容绘制到不同的表面视图上,您​​能否分享一些关于绘制到第二个表面的可能性的输入?我明白你在说什么,但我没有找到一种方法将在一个表面视图中绘制的内容“复制/传输”到表面(因为我只有表面,但没有附加任何处理程序)。
  • Surface 就像一个界面,您可以在上面绘图,但不能从中读取。例如,如果您的 Surface 是从 SurfaceView 创建的,那么您可以使用 PixelCopy 从源 SurfaceView 复制位图。然后锁定目标 Surface 的画布并在其上绘制位图。
  • 好的,我们越来越近了,这是一个好兆头。我认为除了位图之外的任何其他复制方式都可能是一项昂贵的操作,每帧都进行并绘制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2015-05-17
  • 2012-08-12
相关资源
最近更新 更多