5

我需要将视频解码为一系列位图,以便我能够修改它们,然后将它们压缩回 android 中的视频文件。

我计划通过使用getFrameAtTime并将其保存到图像序列来管理它。然后我可以修改序列中的图像并将其编码回电影。但我有两个问题:

  • 首先,当我读到它时,它getFrameAtTime是用于创建缩略图并且不能保证返回正确的帧。这使得视频滞后。
  • 其次,保存图像并读取它需要很长时间。

我读到使用 MediaExtractor 进行解码的正确方法,这很好,但我只有示例将其直接呈现为surfaceView. 我有什么办法可以将其转换outputBuffer为位图吗?

我需要它来让它与 16 及以上的 api 级别一起工作。

4

2 回答 2

8

您可以在bigflake站点上找到一系列有用的示例。

特别是,ExtractMpegFramesTest演示了如何将 .mp4 文件解码为Bitmap,以及如何对DecodeEditEncodeTestH.264 流进行解码和重新编码,使用 GLES 着色器修改帧。

许多示例使用 API 18 中引入的功能,例如Surface输入到MediaCodec(这避免了许多颜色格式问题)和MediaMuxer(它允许您将原始 H.264 基本流MediaCodec转换为 .mp4 文件) . 一些设备允许您将视频提取为 YUV 数据ByteBuffer,对其进行修改和重新编码,但其他设备提取为专有的 YUV 颜色格式,可能会被 API 16 版本拒绝MediaCodec

我建议为 API 18(Android 4.3 “Jellybean”MR2)或更高版本编写代码。

于 2013-12-09T15:58:53.817 回答
1

有很多人说该方法onFrameAvailable()永远不会被调用。好吧,监听器应该在与主线程不同的线程中。要设置侦听器,请执行以下操作:(这是实现的类侦听器SurfaceTexture.IOnFrameAvailableListener):

mSurfaceTexture.SetOnFrameAvailableListener(this);
于 2016-01-12T19:49:03.673 回答