解码器/编码器的输出/输入Surface
分别是一个特别配置的(任何一个物理上连续的 or reserved等)一块专门用于硬件的内存(例如,GPUs
、硬件(加速)编解码器)或软件模块可以以最适合性能需求的方式使用(通过使用硬件加速、DMA 等功能)。
更具体地说,例如在当前上下文中,解码器的输出 Surface 由SurfaceTexture
,这样它就可以用在OpenGL environment
用作external在将纹理渲染到 Surface 上之前进行任何类型的处理,编码器可以从中读取和编码以创建最终的视频帧。
并非巧合的是,OpenGL 只能渲染到这样的Surface
.
So the decoder充当provider原始视频帧的表面纹理) the carrier, OpenGL the medium将其呈现给编码器input Surface哪一个是目的地对于(要编码的)视频帧。
为了进一步满足您的好奇心,请检查使用 MediaCodec 编辑帧和编码 https://stackoverflow.com/questions/34932623/editing-frames-and-encoding-with-mediacodec更多细节。
[Edit]
您可以检查子项目grafika
连续相机 https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java or 显示+捕捉相机 https://github.com/google/grafika/blob/master/src/com/android/grafika/CameraCaptureActivity.java,当前将相机帧(馈送到 SurfaceTexture)渲染到视频(和显示器)。因此,本质上,唯一的变化是 MediaCodec 将帧传送到 SurfaceTexture,而不是相机。
谷歌CTS解码编辑编码测试 https://android.googlesource.com/platform/cts/+/kitkat-release/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java完全相同,可以作为参考,以使学习曲线更加平滑。
从最基本的开始,正如 fadden 指出的那样,使用Android 图形教程 https://source.android.com/devices/graphics/architecture.html