使用MediaCodec和MediaExtractor解码和编码视频

时间:2013-12-09 10:25:33

标签: android video bitmap mediacodec mediaextractor

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

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

  • 首先,在我阅读时,getFrameAtTime用于创建缩略图,但不保证返回正确的帧。这使得视频延迟。
  • 其次,保存图像并将其读回需要很长时间。

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

我需要它才能使用16级及以上的api级别。

2 个答案:

答案 0 :(得分:8)

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

特别是,ExtractMpegFramesTest演示了如何将.mp4文件解码为BitmapDecodeEditEncodeTest解码并重新编码H.264流,使用GLES着色器。

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

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

答案 1 :(得分:1)

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

mSurfaceTexture.SetOnFrameAvailableListener(this);