android - 使用 MediaCodec 和 MediaExtractor 对视频进行解码编码

标签 android video bitmap android-mediacodec mediaextractor

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

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

  • 首先,据我所知,getFrameAtTime 用于创建缩略图,不能保证返回正确的帧。这会导致视频延迟。
  • 其次,保存图像和读取它需要很长时间。

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

我需要它才能在 16 及以上的 API 级别上工作。

最佳答案

您可以在 bigflake 上找到一组有用的示例网站。

特别是,ExtractMpegFramesTest 演示了如何将 .mp4 文件解码为 BitmapDecodeEditEncodeTest 解码并重新编码 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/

相关文章:

android - 用于 Firefox 和 Chrome 的 MPEG 4 Visual 的 <video> 标签

c++ - 如何提取音频/视频文件的持续时间?

java - 在多线程应用程序 Android 中访问数据库的最佳方式?

java - 没有数据的 RxJava2 主题

android - 将网络图像发布到 Glass 卡片

android - Android ImageButton 背景的挑战

android - 将位图的大小减小到 Android 中的某个指定像素

安卓保存铃声小编辑

ios - 在保存到照片卷之前为视频文件指定一个特定的名称 - iOS

c# - 从一种 PixelFormat 转换为另一种 WPF