我需要将视频解码为一系列位图,以便我能够修改它们,然后将它们压缩回 android 中的视频文件。
我计划通过使用 getFrameAtTime
并将其保存到图像序列中来管理它。然后我可以修改序列中的图像并将其编码回电影。但是我有两个问题:
- 首先,据我所知,
getFrameAtTime
用于创建缩略图,不能保证返回正确的帧。这会导致视频延迟。 - 其次,保存图像和读取它需要很长时间。
我读到进行解码的正确方法是使用 MediaExtractor,这很好,但我只有将其直接渲染到 surfaceView
的示例。有什么方法可以将 outputBuffer
转换为位图吗?
我需要它才能在 16 及以上的 API 级别上工作。
最佳答案
您可以在 bigflake 上找到一组有用的示例网站。
特别是,ExtractMpegFramesTest
演示了如何将 .mp4 文件解码为 Bitmap
,DecodeEditEncodeTest
解码并重新编码 H .264 流,使用 GLES 着色器修改帧。
许多示例使用了 API 18 中引入的功能,例如 Surface
输入到 MediaCodec
(避免了一些颜色格式问题),以及 MediaMuxer
(它允许您将来自 MediaCodec
的原始 H.264 基本流转换为 .mp4 文件)。一些设备将允许您将视频提取为 ByteBuffer
中的 YUV 数据,对其进行修改并重新编码,但其他设备将提取为可能被 API 16 版本拒绝的专有 YUV 颜色格式 MediaCodec
。
我建议为 API 18(Android 4.3“Jellybean”MR2)或更高版本编码。
关于android - 使用 MediaCodec 和 MediaExtractor 对视频进行解码编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20468211/