繁体   English   中英

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

[英]Use MediaCodec and MediaExtractor to decode and code video

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

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

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

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

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

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

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

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

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

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

mSurfaceTexture.SetOnFrameAvailableListener(this);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM