我需要将视频解码为一系列位图,以便我能够修改它们,然后将它们压缩回android中的视频文件。
我打算使用getFrameAtTime
并将其保存到图像序列来管理它。然后我可以修改序列中的图像并将其编码回电影。但我有两个问题:
getFrameAtTime
用于创建缩略图,但不保证返回正确的帧。这使得视频延迟。我读到使用MediaExtractor进行解码的正确方法,这很好,但我只有示例将其直接呈现给surfaceView
。我有什么方法可以将outputBuffer
转换为位图吗?
我需要它才能使用16级及以上的api级别。
答案 0 :(得分:8)
您可以在bigflake网站上找到一系列有用的示例。
特别是,ExtractMpegFramesTest
演示了如何将.mp4文件解码为Bitmap
,DecodeEditEncodeTest
解码并重新编码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);