当前位置: 首页 > 知识库问答 >
问题:

用MediaCodec编辑帧和编码

蒯慈
2023-03-14

我能解码一个mp4视频。如果我使用surface配置解码器,我可以在屏幕上看到视频。现在,我要编辑帧(添加一条黄线,甚至更好的是重叠一个微小的图像),并将视频编码为一个新的视频。不需要显示视频,我现在也不关心性能。(如果我在编辑时显示帧,如果编辑功能花费大量时间,我可能会有间隙),那么,你给我推荐什么呢?还是用GlSurface配置解码器,使用OpenGL(GLES),或者用null配置解码器,以某种方式将ByteBuffer转换为bitmap,修改它,并将位图编码为字节数组?此外,我在Grafika页面中看到,您可以使用一个带有自定义Rederer的Surface和使用OpenGL(GLES)。谢谢

共有1个答案

辛建业
2023-03-14

您必须使用opengles。ByteBuffer/Bitmap方法不能提供真实的性能/特性。

现在您已经能够(使用MediaExtractor和Codec)将视频解码为表面,您需要使用用于将表面创建为外部纹理SurfaceTexture并使用GLES呈现到从配置为编码器的MediaCodec检索的另一个表面

虽然grafika没有完全类似的完整项目,但您可以从现有项目开始,然后尝试使用grafika连续相机或Show+capture相机中的以下子项目之一,该相机当前将Camera帧(馈送到SurfaceTexture)呈现为视频(和显示)。因此,本质上,唯一的改变是mediacodec将帧馈送到surfacetexture而不是camera

谷歌CTS DecodeEditEncodeTest做的完全相同,可以作为参考,以便使学习曲线更平滑。

使用这种方法,你当然可以做各种各样的事情,比如操纵视频的播放速度(快进慢下),在场景上添加各种覆盖,使用着色器播放视频中的颜色/像素等。

在Show+capture camera中签出滤镜,以获得相同的插图。

解码-编辑-编码流程

虽然现代硬件编解码器支持同时进行视频编码和解码,但我建议,在同一线程中进行解码、呈现和编码,尤其是在您的情况下,此时性能并不是一个主要的关注点。这将有助于避免自己处理同步和/或帧跳转的问题。

 类似资料:
  • 我们刚刚了解了属性帧的操作,现在来看看具体怎么创建一个帧动画。 为节点新增 Sprite 组件 首先我们需要让节点能正常显示纹理,所以需要为节点增加Sprite组件。 选中节点后在属性检查器中通过 添加组件 按钮,选择 UI -> Render -> Sprite。 在属性列表中添加 Sprite.spriteFrame 节点可以正常显示纹理后,还需要为纹理创建一个属性轨道。 在动画编辑器属性列表

  • 我们刚刚了解了属性帧的操作,现在来看看具体怎么创建一个帧动画。 为节点新增 Sprite 组件 首先我们需要让节点正常显示纹理,所以需要为节点添加 Sprite 组件。在 层级管理器 中选中节点,然后点击 属性检查器 最下方的 添加组件 按钮,选择 渲染组件 -> Sprite,即可添加 Sprite 组件到节点上。 在属性列表中添加 cc.Sprite.spriteFrame 节点可以正常显示纹

  • 我使用MediaCodec对相机数据进行编码,当我在一个名为Vivo X5 Pro(android 5.0,API 21)的设备上使用时,MediaCodec编码的数据大小在90000以上,在其他设备上通常是15000左右,但是我改变了媒体格式的参数,也不起作用。在Vivo X5 Pro(android 5.0,API 21)上用MediaCodec.getOutputFormat()方法得到的格

  • 我正在尝试使用android AudioRecord和MediaCodec对aac音频进行编码。我创建了一个非常类似于(使用Android MediaCodec从相机编码H.264)的编码器类。使用此类,我创建了一个AudioRecord实例,并告诉它将其byte[]数据读出到AudioEncoder(audioEncoder.offerEncoder(Data))。 这是我的音频记录设置 我成功

  • 在JavaFX 8中,我尝试在将新行添加到表中后编辑单元格,以优化用户体验。 选择了正确的行,但单元不会进入编辑模式。嗯,我很偶然地看到了这种情况,但很难再现。我做错了什么?

  • Threejs提供了一系列用户编辑和播放关键帧动画的API,例如关键帧KeyframeTrack、剪辑AnimationClip、操作AnimationAction、混合器AnimationMixer。 为了让大家更好的理解关键帧动画,本节课不加载外部模型的帧动画数据,使用关键帧KeyframeTrack和剪辑AnimationClip编写一个关键帧动画,然后调用操作AnimationAction